发新帖我要提问
12
返回列表
打印

用ARM7做工控板的血泪史...同时向大家求助...

[复制链接]
楼主: zq1987731
手机看帖
扫描二维码
随时随地手机跟帖
21
zq1987731|  楼主 | 2008-12-26 19:04 | 只看该作者 回帖奖励 |倒序浏览

...

To Mr.vwwj
    线性光耦麻烦就麻烦在校准上...每一个产品出厂都要校准校准再校准...从RTC到模拟输入输出一路下来费时较多...这里的“时间成本”就比较多了,不太适宜量产...
    用到的5V器件主要有光耦6N137,其余的都可换成3.3V逻辑,最近突然发现有HCPL-063这么个光耦,直接换掉...这下纯3.3V了...
    考虑到电路板体积,还是不决定用运放作为缓冲输入了,况且之前还为每个运放配了调零电位器,这叫一个浪费...(对老板而言)  
    后面又和老板交流了下确定模拟输入输出均不需要隔离(估计被成本吓住了)...
    程序部分我所做的只是一个板级驱动包+资源分配+任务监视的平台,需要加上梯形图语句翻译过来的上千句C才算完整程序,而软件部分,下面列举一个PWM初始化程序:
//===============================================================
    void PWMInit(void)
    {      
        DEF_PWM_PORT_CONFIGURATION();       // PWM0H, PWM1H Config (Out)

        PWMCON  =  (0 <<  4)                // External Sync Select         1 - Use external sync           0 -  use internal sync                                                                          
                |  (0 <<  3)                // External Sync Select         1 - Select external synchronous sync signal, Cleared for asynchronous sync signal.                                            
                |  (0 <<  2)                // Double Update Mode           1 - Enable double update mode   0 - Enable single update mode.                                             
                |  (0 <<  1)                // PWM Synchronization Enable   1 - Enable synchronization      0 - Disable synchronization                                            
                |  (1 <<  0);               // PWM Enable Bit               1 - Enable the PWM              0 - Disable the PWM 
                                            //                                                                  Also cleared automatically with PWMTRIP                                         

        PWMCFG  =  (0 <<  9)                // (CHOPLO) Low-Side Gate Chopping Enable Bit   1 - Enable      0 - Disable
                |  (0 <<  8)                // (CHOPHI) High-Side Gate Chopping Enable Bit  1 - Enable      0 - Disable
                |  (0 <<  7)                // (GNCLK)  PWM Gate Chopping Period (Unsigned, 7 to 0)
                |  (0 <<  6)                // Tchop = (4 × (GDCLK + 1)) × Tcore  
                |  (0 <<  5)                // Fchop = Fcore/(4 × (GDCLK + 1))
                |  (0 <<  4)
                |  (0 <<  3)
                |  (0 <<  2)
                |  (0 <<  1)
                |  (0 <<  0);

        PWMEN   =  (0 <<  8)                // Channel 0 Output Crossover   1 - Enable      0 - Disable
                |  (0 <<  7)                // Channel 1 Output Crossover   1 - Enable      0 - Disable
                |  (0 <<  6)                // Channel 2 Output Crossover   1 - Enable      0 - Disable
                |  (1 <<  5)                // 0L Output                    1 - Disable     0 - Enable
                |  (0 <<  4)                // 0H Output                    1 - Disable     0 - Enable 
                |  (1 <<  3)                // 1L Output                    1 - Disable     0 - Enable
                |  (0 <<  2)                // 1H Output                    1 - Disable     0 - Enable
                |  (1 <<  1)                // 2L Output                    1 - Disable     0 - Enable
                |  (1 <<  0);               // 2H Output                    1 - Disable     0 - Enable

        PWMDAT0 = 0xFFFF;                   // Switching period - Maximum PWMDAT0 = Fcore/(2 × Fpwm)
        PWMDAT1 = 0x0000;                    // Dead time - 0
        
        #if DEF_ENABLE_PWM0

        PWMCH0  = 0x7FFF;                   // Duty cycles - 0%

        #endif

        #if DEF_ENABLE_PWM1

        PWMCH1  = 0x7FFF;                   // Duty cycles - 0%

        #endif

        #if DEF_ENABLE_PWM2

        PWMCH2  = 0x7FFF;                   // Duty cycles - 0%

        #endif

        PWMDAT2 = 0x0000;                   // Sync pulse width - 0
    }
//===============================================================
    也算是个人编程风格吧,都成习惯了...当然接手的人能不能看得懂我就不清楚了,至少我自己肯定没问题...(曾经有个很无聊的同学把类似于上面括号里的0和1直接算出然后给寄存器赋一个16进制初始化值说是程序优化...- -...)
    我所说的跑飞...如果是硬狗的话,其复位低电平输出持续100ms(因为用了FM31256这个FRAM自带的WDT所致...这个时间是不受MCU控制的固定值...加上1秒的周期(这1秒内MCU死得连中断都无法进入)所以总的影响时间已经很明显了,最近正在考虑这个问题呢(虽然死机无数回还没碰上过,但据说有人遇到过,所以不得不防...)



To Mr.zheng79
    故意不用大的电解电容主要是因为大电容对启动问题、低电压检测、快速关机要求的冲突...就是断电后所有输出都要在第一时间断开,不能利用残余电压继续工作,这里所指的是2200μF或以上的大电解电容...
    大电解虽然没有,但100μF+0.01μF的坦电容+陶瓷电容组合作为电源进线滤波的处理还是有的,另外如果非滤波用的电容也算在内...倒是有一个:3.3V/1F的...
    本来想用示波器的,虽然单位里那个不怎么好,但至少算是全公司最先进的设备了,然后我郁闷得发现...机壳不组装完整无法接线(接线端子的结构造成的,且机壳是要挂在离地面一定距离的地方),想接个示波器探头...实在是无处下手...把复位信号连根线出来么...这个辐射问题就严重了,故只好用类似“黑盒测试”的方法从现象上分析了...
    目前我是打算用AC-DC,价格相当昂贵(对老板来说)1K量单只39RMB的样子,对方工程师在电话里说是如何如何厉害,当然只有试了才知道效果如何..







    今天老板似乎格外大方,FM18L08作为外部并行总线SRAM+EEPROM的结合体使用的方案被肯定了...这可是2X元的重量级芯片了,这样一来断电后需要处理的任务明显减少了一个最占时间的...目前来说我的系统中为了抗干扰考虑,在高速信号上根据干扰频率上串了磁珠、高速数字器件的电源输入端更是用了三端电容代替陶瓷电容退偶用,DC输入端也不仅仅只有那对电容组合了,而是根据AC-DC模块开关频率的噪声频谱选用了相对影响最大的噪声频点衰减dB较多的直流用共模扼流圈+三端电容的组合...
    不过这些方案都在天上飘呢...单位里采购大叔经常喜欢光顾固定的几个店面(上海赛格),很多我需要的IC及元件只要他的那几个熟悉的店面没有,就宣布“买不到”,后面发展到他买回“差不多”的就拿“差不多”的来修改方案...总之再适合的方案,只要“买不到”就要推翻.................
    当然了,工控产品为了可靠性考虑根本不能这么到处省钱的,但毕竟是帮老板做东西,他要省我也没办法...而且既然是纯手工制作,难免出现虚焊等等不良问题,相当于——元件越多故障越多,而且手焊的LQFP-80...不拿万用表一个个量过去还真不知道成功不成功,真不知道到了量产该怎么办...况且现在灌程序还用的JTAG接口呢...
    看来离产品化还有段时间,幸好老板没怎么催,不然可要急死...

使用特权

评论回复
22
wacke| | 2008-12-26 19:42 | 只看该作者

佩服你佩服到无语!

使用特权

评论回复
23
yewuyi| | 2008-12-26 19:55 | 只看该作者

俺不说话,俺就看贴。。。

使用特权

评论回复
24
zq1987731|  楼主 | 2008-12-28 01:00 | 只看该作者

...

    非常感谢Mr.SYJ_SUN的好意...承蒙看得起..但请允许我婉转的拒绝..理由如下:
    (1)现在的老板是恩师的好朋友,不想丢恩师面子..
    (2)由于是我一个人做项目,按老板的意思不太会招第二个人进来,那么勤俭节约的老板这一块基本就算白投资了...那就太对不起他了..
    (3)最主要原因是...近(从家里到公司骑车15分钟,从上海到广州-_-!)
    
===============================================================

     目前项目进展程度因为资源问题,他们(单位里用PLC的那些同事)总算意识到资源不够用了...(因为用来和三菱、欧姆龙等等的PLC比,确实RAM太少)所以允许在充分考虑可靠性的情况下适当增强系统配置,这样就有发挥空间了...为了第二稿更加完美,我还是决定启用四层板,当然老板通不通过只有周一才知道了。然后个人认为工控产品的壳子也很重要,目前所用的工控机壳又是塑料又笨重,给人的感觉就是——做工粗糙。总结下来:
    (1)外观:启用新壳,双端子排,目的在于将板上浪费的资源最大化利用,同时使元件布局较紧凑,之前的设计为了“适应”壳子,有高速时钟线(50%占空比)长达20cm走线的情况....
    (2)核心:以网状法拉第笼屏蔽整个核心部分正反面,同时所有对外接口处均以直连稳定地平面的三端电容及磁珠滤波处理。
    (3)电源:以压敏电阻XY接法置于电源入口保险丝之后,Y处2只压敏电阻串联一只TSS后接地线,作为前级浪涌抑制,然后以共模扼流圈+差模扼流圈的组合置于压敏电阻后级,在其两侧同样以XY形式加1μF/275V安规电容,以XY接法的TVS作为末级保护,用以抑制瞬变干扰,然后接入2000V隔离电压AC-DC模块,彻底隔绝传导形式干扰,输出直流24V供IO输入,5V处通过LDO转换为3.3V后以三端电容滤除高频噪声,并获得最小的电源纹波(目前的MCU电源纹波超过50mVp-p就无法工作)模拟部分同样以AC-DC转换得到三路(5V、±15V)与系统数字部分不共地。
    (4)软件:这部分基本无需改动...只是适当改变管脚配置即可。

===============================================================

    下面继续废话:
    按照老板的说法,要我将自己做的一切东西都规范文档化,要做到不是这个专业的人都可以一眼看懂,感觉比较困难...用户手册的编写到不是麻烦事,但涉及到系统软硬件设计,用几份文档就可以做到“非本专业”的人都可以全权接手继续研发...实在是件棘手的事...
    估计其中应该还涉及到我所使用的软件教程...-_-! 本人比较喜欢“新”的软件:Altium Designer Winter 09、RealView MDK 3.24、QuartusII 8.0 SP1、Visual Studio 2008等等...如果说我写的文档能代替那些专家出的软件教程,我不就是专家了么?...
    此外最麻烦的仍属Layout,由于某种原因(大家都知道),我现在工作用的笔记本是自己大二时父母帮忙买的Acer Aspire 5585...Core2 T7200的核+2G内存+独显,现在用Altium Designer主要是看中其3D功能以及差分走线、推挤布线等等的便利,那么公司没有一台电脑能跑得动,更别谈3D功能了(PentiumIII+192M内存+其余主板集成的电脑装完该软件得到个警告:“灾难性故障”...这叫一个惊人...)...那么就是矛盾的地方了...这部分东西已经不是“便于理解”而是“打不打得开”的问题了...
    现在看来真是一团糟,事后的文档整理本质上就是在写教科书了,晕...不知道大家所在的公司都是什么情况...

使用特权

评论回复
25
vwwj| | 2008-12-28 01:10 | 只看该作者

不知道你怎么想的

  难道PCB不是要手工布线么?一个Protel99足够
  自动布线只会有更多麻烦

使用特权

评论回复
26
zyok| | 2008-12-28 01:21 | 只看该作者

晕死~

使用特权

评论回复
27
zq1987731|  楼主 | 2008-12-28 01:57 | 只看该作者

To Mr.vwwj

    我画PCB自然是全手工布线,自动...除了应付考试外从没用过...
    不用Protel 99,最主要还是因为不方便...2D甚至3D上的封装冲突几乎只能靠经验而不能依靠3D模型来判断,加之布总线需要设定好规则很有规律性得一条条手动拉过去,需要中间插一根代表旁边的都要动,而推挤布线就没这问题,布的那个总线整齐得不得了,插一根线进去旁边的线会自动让开,光凭这一点我就毫不犹豫得丢弃Protel 99...此外差分对走线等长等距...依靠Protel 99实在要算上老半天...还有一大堆问题...
    另外我的习惯就是一切向新的看...主要因为学校里重视对一些旧软件(Word 97、Windows 98、VB6.0、Photoshop 6.0、Protel 99等等)的教学使我产生了逆反心理...为此成了“Byte奴隶”,什么新出下什么,家里台式机为此24小时下载(迅雷于今天到24280分总算挤入全球20W名内了)...

使用特权

评论回复
28
SYJ_SUN| | 2008-12-28 12:12 | 只看该作者

赞一个!这样的品格也是我所欣赏的.

希望以后有机会合作.

使用特权

评论回复
29
avocationA| | 2008-12-28 18:48 | 只看该作者

强!!

使用特权

评论回复
30
dragon_hn| | 2008-12-28 19:54 | 只看该作者

惊叹!

C代码+注释就有1.5M大小...编译后50多K

使用特权

评论回复
31
JiaoJinXing| | 2009-1-8 15:33 | 只看该作者

瀑布汗

使用特权

评论回复
32
修愚2003| | 2009-1-9 16:01 | 只看该作者

才半年啊,很厉害

佩服

使用特权

评论回复
33
yxwsz| | 2009-1-11 17:56 | 只看该作者

建议

如果对PLC不懂的话,建议你拆一个PLC,好好研究一下,吸取一下别人的长处。
如果自己没有一点概念,就直接开始做,肯定有一堆的问题。

使用特权

评论回复
34
zwjgg| | 2009-1-11 23:59 | 只看该作者

楼主很强悍,

C代码+注释就有1.5M大小!!是一个什么概念?  

使用特权

评论回复
35
将军令| | 2009-2-11 11:16 | 只看该作者

恩,楼主有前途

使用特权

评论回复
36
hq_y| | 2009-2-11 12:03 | 只看该作者

有前途啊

使用特权

评论回复
37
25456426| | 2013-5-30 10:55 | 只看该作者
榜样的力量是无穷的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则