比如你想生成的PWM的时钟信号频率为10K,然后你就可以利用10K的PWM时钟源计数生成周期为(1~4095)*(1/10000)的PWM波形了。
其实再次修改程序,你还可以计算PWM周期计数器与高电平相关的值。
目前提供Lua脚本的
- function get(my)
- --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
- Fhirc=24000000
- --下面几个变量都是临时变量使用,初始化多少都行
- CKDIV=0
- Fsys=0
- pre=1
- Fpwm=0
- i=0
-
- for CKDIV=0,255 do
- for i=0,7 do
- pre=2^i
- if(CKDIV==0) then Fsys=Fhirc
- elseif((CKDIV>0)and(CKDIV<=0xFF))
- then Fsys=Fhirc/(2*CKDIV)
- end
- Fpwm=Fsys/pre
- if(my==Fpwm) then
- print("pre="..pre.."CKDIV="..CKDIV)
- end
- end
- end
- end
- get(10000)
复制代码
发现有两组参数可以满足需求
pre=16.0CKDIV=75
pre=8.0CKDIV=150
CKDIV是这里,选择内部的RC振荡器后的分频
CKDIV = 75;
PWM0_ClockSource(PWM_FSYS,16);
或者
CKDIV = 150;PWM0_ClockSource(PWM_FSYS,8);
- function get(my)
- --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
- Fhirc=24000000
- --下面几个变量都是临时变量使用,初始化多少都行
- CKDIV=0
- Fsys=0
- pre=1
- Fpwm=0
- i=0
-
- for CKDIV=0,255 do
- for i=0,7 do
- pre=2^i
- if(CKDIV==0) then Fsys=Fhirc
- elseif((CKDIV>0)and(CKDIV<=0xFF))
- then Fsys=Fhirc/(2*CKDIV)
- end
- Fpwm=Fsys/pre
- if(my==Fpwm) then
- print("PWM时钟频率为"..my.."Hz".." 需要设置".."pre="..pre..", CKDIV="..CKDIV)
- end
- end
- end
- end
- get(10000)
- print("-----------------------------------")
- get(15000)
- print("-----------------------------------")
- get(20000)
复制代码
优化了一下显示形式,输出结果,可以看出为了达到某个结果,实际上可以通过多组分频组合实现。
- PWM时钟频率为10000Hz 需要设置pre=16.0, CKDIV=75
- PWM时钟频率为10000Hz 需要设置pre=8.0, CKDIV=150
- -----------------------------------
- PWM时钟频率为15000Hz 需要设置pre=32.0, CKDIV=25
- PWM时钟频率为15000Hz 需要设置pre=16.0, CKDIV=50
- PWM时钟频率为15000Hz 需要设置pre=8.0, CKDIV=100
- PWM时钟频率为15000Hz 需要设置pre=4.0, CKDIV=200
- -----------------------------------
- PWM时钟频率为20000Hz 需要设置pre=8.0, CKDIV=75
- PWM时钟频率为20000Hz 需要设置pre=4.0, CKDIV=150
复制代码
|