你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用Lua编写计算ML51单片机PWM时钟源的程序

[复制链接]
gaosmile 发布时间:2021-1-28 10:36
比如你想生成的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)
复制代码

微信图片_20210128103515.png
发现有两组参数可以满足需求
pre=16.0CKDIV=75
pre=8.0CKDIV=150

微信图片_20210128103520.png
CKDIV是这里,选择内部的RC振荡器后的分频
微信图片_20210128103524.png
CKDIV = 75;
PWM0_ClockSource(PWM_FSYS,16);
或者
CKDIV = 150;PWM0_ClockSource(PWM_FSYS,8);

  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
复制代码


收藏 评论0 发布时间:2021-1-28 10:36

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版