如题, 系统内部的pwm受外接的HMI或者PC控制. 通过一定的数据协议,如果modbus 或者某种简单的串口通信协议.
控制端,将要修改的参数, 频率或者占空比传递过来, 如何来实现数据的刷新,并且实时更新这些参数到pwm的输出波形呢
最简单的一个思路, 定义2组变量, 对于同一个控制参数,如频率, 有2个变量对应, 一个是now 一个是last,
在程序循环中,不断的比较now和last的关系, 如不同,则发生变化, 则进行一次数据更新行为, 并且讲最新的参数更新到pwm发生器,从而体现在输出波形上;
于是构造如下函数:
- /*
- ** pwm是否需要更新,比较上一次的频率和脉宽值,如果不同,则更新
- */
- void pwm_update_loop( void )
- {
- /*1,第一路判断: 频率 或 占空比发生变化 */
- if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) ||
- HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST )
- {
- /* 更新 频率和占空比的记录值 */
- HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ;
- HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY;
- /* 更新当前通道的PWM波形 */
- pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY );
- }
- /*2,第二路判断 */
- if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) ||
- HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST )
- {
- /* 更新 频率和占空比的记录值 */
- HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ;
- HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY;
- /* 更新当前通道的PWM波形 */
- pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY );
- }
- /*3,第三路判断 */
- if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) ||
- HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST )
- {
- /* 更新 频率和占空比的记录值 */
- HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ;
- HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY;
- /* 更新当前通道的PWM波形 */
- pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY );
- }
- }
[color=rgb(51, 102, 153) !important]复制代码
如图,该函数作为系统的loop循环工作函数之一,不断的被调用,但是,有新的控制值过来时,只会更新一次,之后就保持不变了.仅作数据的last和now的比较判断..夜深了 ... good night. maybe should say: Morning - while(1)
- {
- /*1- 看门狗 */
- wdt_reset();
- /*2 - 通信响应,接收命令 */
- mod_process();
- /*3- 收到命令,进行波形输出 */
- //考虑到波形实时性要求,本函数安排在定时器
- //中断中,为保证输出的调制波与800hz的基波匹配
- //中断的溢出频率与基波的频率保持一直,
- //recipe_out();
- /*4- 处方的基波频率和占空比(脉宽控制 ) */
- pwm_update_loop();
- /* 5 -系统软定时器响应 */
- on_timer();
- }
已经mdk中调试通过. 利用在线调试, 无需外接通信,即可模拟,首先在view菜单下,
把这勾上:
把需要观察的变量都 添加到watch,然后全速运行,双击要修改的值,然后修改,按回车,原来的频率为800hz, 新值为1000
最后看,经过算法运行之后,数值发生变化,last和now都变成了1000hz,示波器观察,确实变了
最重要的是, 整个过程mdk实在全速运行,不需要停下
来, 这时候, MDK调试平台,化作一个最高效直接的
PWM发生器,直接键盘操作,
就可以改变pwm的频率和占空比..
|
| [url=http://atmel.eefocus.com/module/forum/thread-68-1-1.html][/url]
|
懒得上传 图片 重新发帖了 ,直接把自己发表的东西粘贴过来了 见谅..
NuTool-PinConfig_Rev.1.08.zip
(5.89 MB, 下载次数: 948)
Nu-Link_Keil_Driver 1.31.6535.part01.rar
(2 MB, 下载次数: 1645)
Nu-Link_Keil_Driver 1.31.6535.part02.rar
(2 MB, 下载次数: 1528)
Nu-Link_Keil_Driver 1.31.6535.part03.rar
(2 MB, 下载次数: 1534)
Nu-Link_Keil_Driver 1.31.6535.part04.rar
(2 MB, 下载次数: 1574)
Nu-Link_Keil_Driver 1.31.6535.part05.rar
(2 MB, 下载次数: 1587)
Nu-Link_Keil_Driver 1.31.6535.part06.rar
(2 MB, 下载次数: 1539)
Nu-Link_Keil_Driver 1.31.6535.part07.rar
(2 MB, 下载次数: 1499)
Nu-Link_Keil_Driver 1.31.6535.part08.rar
(2 MB, 下载次数: 1504)
Nu-Link_Keil_Driver 1.31.6535.part09.rar
(2 MB, 下载次数: 1548)
Nu-Link_Keil_Driver 1.31.6535.part10.rar
(2 MB, 下载次数: 1593)
Nu-Link_Keil_Driver 1.31.6535.part11.rar
(1.77 MB, 下载次数: 1529)
|