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接口呢... 看来离产品化还有段时间,幸好老板没怎么催,不然可要急死... |