[牛人杂谈]

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

[复制链接]
650|10
手机看帖
扫描二维码
随时随地手机跟帖
gaoyang9992006|  楼主 | 2020-7-21 16:55 | 显示全部楼层 |阅读模式
比如你想生成的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)
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 | 显示全部楼层
796075f16b4c9b6d6a.png

使用特权

评论回复
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 | 显示全部楼层

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


使用特权

评论回复
稳稳の幸福| | 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 | 显示全部楼层
高手。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1893

主题

15620

帖子

197

粉丝