[牛人杂谈] 用Lua编写了个计算ML51单片机PWM时钟源的程序

[复制链接]
1576|10
 楼主| gaoyang9992006 发表于 2020-7-21 16:55 | 显示全部楼层 |阅读模式
比如你想生成的PWM的时钟信号频率为10K,然后你就可以利用10K的PWM时钟源计数生成周期为(1~4095)*(1/10000)的PWM波形了。
其实再次修改程序,你还可以计算PWM周期计数器与高电平相关的值。。
其他不多说,想要更好的,嘿嘿,打赏一下,我继续更。甚至做成一个小软件形式。
目前提供Lua脚本的

  1. function get(my)
  2. --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
  3.         Fhirc=24000000
  4. --下面几个变量都是临时变量使用,初始化多少都行       
  5.         CKDIV=0
  6.         Fsys=0
  7.         pre=1
  8.         Fpwm=0
  9.         i=0
  10.        
  11.         for CKDIV=0,255 do
  12.                 for i=0,7 do

  13.                                 pre=2^i
  14.                                 if(CKDIV==0)        then Fsys=Fhirc
  15.                                 elseif((CKDIV>0)and(CKDIV<=0xFF))
  16.                                                                 then Fsys=Fhirc/(2*CKDIV)
  17.                                 end
  18.                                 Fpwm=Fsys/pre
  19.                                 if(my==Fpwm) then
  20.                                 print("pre="..pre.."CKDIV="..CKDIV)
  21.                                 end                       
  22.                 end
  23.         end
  24. end

  25. get(10000)
437775f16ad4c4461e.png
发现有两组参数可以满足需求
pre=16.0CKDIV=75
pre=8.0CKDIV=150


 楼主| gaoyang9992006 发表于 2020-7-21 17:25 | 显示全部楼层
648705f16b46c94a1e.png
CKDIV是这里,选择内部的RC振荡器后的分频
 楼主| gaoyang9992006 发表于 2020-7-21 17:26 | 显示全部楼层
 楼主| gaoyang9992006 发表于 2020-7-21 17:29 | 显示全部楼层

    CKDIV = 75;
PWM0_ClockSource(PWM_FSYS,16);

或者
    CKDIV = 150;
PWM0_ClockSource(PWM_FSYS,8);
 楼主| gaoyang9992006 发表于 2020-7-21 17:29 | 显示全部楼层
也可以全部用寄存器实现。
 楼主| gaoyang9992006 发表于 2020-7-21 19:24 | 显示全部楼层

  1. function get(my)
  2. --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
  3.         Fhirc=24000000
  4. --下面几个变量都是临时变量使用,初始化多少都行       
  5.         CKDIV=0
  6.         Fsys=0
  7.         pre=1
  8.         Fpwm=0
  9.         i=0
  10.        
  11.         for CKDIV=0,255 do
  12.                 for i=0,7 do

  13.                                 pre=2^i
  14.                                 if(CKDIV==0)        then Fsys=Fhirc
  15.                                 elseif((CKDIV>0)and(CKDIV<=0xFF))
  16.                                                                 then Fsys=Fhirc/(2*CKDIV)
  17.                                 end
  18.                                 Fpwm=Fsys/pre
  19.                                 if(my==Fpwm) then
  20.                                 print("PWM时钟频率为"..my.."Hz".."        需要设置".."pre="..pre..",        CKDIV="..CKDIV)
  21.                                 end                       
  22.                 end
  23.         end
  24. end

  25. get(10000)
  26. print("-----------------------------------")
  27. get(15000)
  28. print("-----------------------------------")
  29. get(20000)


优化了一下显示形式,输出结果,可以看出为了达到某个结果,实际上可以通过多组分频组合实现。
  1. PWM时钟频率为10000Hz        需要设置pre=16.0,        CKDIV=75
  2. PWM时钟频率为10000Hz        需要设置pre=8.0,        CKDIV=150
  3. -----------------------------------
  4. PWM时钟频率为15000Hz        需要设置pre=32.0,        CKDIV=25
  5. PWM时钟频率为15000Hz        需要设置pre=16.0,        CKDIV=50
  6. PWM时钟频率为15000Hz        需要设置pre=8.0,        CKDIV=100
  7. PWM时钟频率为15000Hz        需要设置pre=4.0,        CKDIV=200
  8. -----------------------------------
  9. PWM时钟频率为20000Hz        需要设置pre=8.0,        CKDIV=75
  10. PWM时钟频率为20000Hz        需要设置pre=4.0,        CKDIV=150


稳稳の幸福 发表于 2020-7-21 22:23 | 显示全部楼层
大神啊。
imshirt 发表于 2020-7-22 19:09 | 显示全部楼层
啥吊一个
zeshoufx 发表于 2020-7-22 21:54 | 显示全部楼层
谢谢分享【Lua编写了个计算ML51单片机PWM时钟源】
 楼主| gaoyang9992006 发表于 2020-7-22 22:13 | 显示全部楼层

运行环境是Lua,你可以用Notepad++安装Lua插件运行,很方便。
mintspring 发表于 2020-7-22 22:30 | 显示全部楼层
高手。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16405

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部