搜索
bottom↓
回复: 8

关于固定频率PWM 占空比可调的个人理解!!!!

[复制链接]

出0入0汤圆

发表于 2014-3-27 07:33:44 | 显示全部楼层 |阅读模式
******************************************************************************************
*                                                                                        *
*                        关于固定频率PWM占空比可调的分析                                 *
*                                                                                        *
******************************************************************************************



导读:
            PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率技术器的使用,方波
        的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号任然是数字的,因为
        在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或
        电流源是一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即
        是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任
        何模拟值都可以使用PWM进行编码

            占空比:指高电平在一个周期之内所占的时间比率。

分析:
            为了达到精确输出频率为10K,所以采用定时器的方式。
            犹豫需要改变占空比,固采用16位定时器工作方式,利用初值重装的方式改变定时
            时间;

知识:      频率是周期的倒数,如果频率是10Khz。那么,周期为1/10k(s)=100us;
            定时器的计算方式:
                                定时T = 计数值N * 机器周期Tcy

                                高八位重装值 = (65536 - 计数值N)/256
                                第八位重装值 = (65536 - 计数值N)%256
            机器周期Tcy  = 12个震荡周期
            震荡周期     = 机器频率的倒数
            机器频率 = 晶振频率
            所以,Tcy = 12/晶振频率

            由于单片机采用的是12Mhz晶振,固机器周期 Tcy = 1us;

            所以最大计数值N = 100;

这里总结出一个初值的计算方式    THx= (65536-定时T/(12/晶振频率(单位是Mhz))) /256
                                  TLx= (65536-定时T/(12/晶振频率(单位是Mhz))) %256


      
再分细一点,就是用频率来算

因为        频率是周期的倒数
        THx= (65536-(1/ 频率(单位是hz))/(12/晶振频率(单位是Mhz))) /256
        TLx= (65536-(1/ 频率(单位是hz))/(12/晶振频率(单位是Mhz))) %256



频率确定,那么,现在开始要开始正题了
****************************************************************************************
*                                                                                       *
*                                 请允许卖萌一下                                       *
*                                                                                      *
****************************************************************************************
        
定时T,取微秒(us)为单位,这里不用叙述,可参考以上;

例如,现在设置一个频率为1Hz的波形

因为频率越低,精度越大(为什么这么说,因为怎么说呢,个人理解理解,就像穿针,慢慢对准穿比快
速穿要准确一点,除非你是大神(MCU超级强悍))


设置一个输出次数,那么,输出次数*单次定时时间等于一个波形的周期,为什么这样做,
这是我经过一日一夜的爆脑子+度娘的解答所知,如果单单通过改变初值的话,我是做不了,不知道
大家能否做的了,但是如果是输出时间*定时时间就可以做了,为什么这样做,请看下文:

unsigner char  OUTPUT_TIMES , FREQUENCY_STEPS;

变量什么意思?问有道:


首先算好单次定时时间;随便取,也可以不要随便,这里取50ms,也就是50000us

那么中断函数的初值基本确定了:
         TL0 = (65536-50000) % 256;
         TH0 = (65536-50000) / 256;

初值确定,那么,次数就要自增了嘛
         OUTPUT_TIMES ++;

然后判断,为什么判断?很简单,因为又不是一次,我要N个循环的嘛,关于次数要设置多少呢?

算:

        1Hz等于多少?1s对不对?

那么,我们的循环次数就应该是20次,这样,我们就可以设置20个级数了

1Hz,我们可以设置的级数比较大(这里的级数是指占空比的大小)

设置为20,这样,想做呼吸灯什么的都很明显了

级数确定,


        来个判断if(OUTPUT_TIMES==20) OUTPUT_TIMES = 0;


循环搞定,来真正要做的了,就是输出波形了

        我们定义了一个级数 FREQUENCY_STEPS,次数叠起来的时间小于 FREQUENCY_STEPS
输出 高电平;次数叠起来的时间小于 FREQUENCY_STEPS输出 低电平;哪儿,占空比就可以可
随便调制啦对不对


        所以,可以这么判断

        if(OUTPUT_TIMES < FREQUENCY_STEPS)  PX^x(这里的X是指4组I/O的任意一组,x是具体到
某个端口了,当然你也可以让一组或者多组来输出)  = 0xff(或者是1)

        else  PX^x(同上) = 0x00(或者是0);这里有点废,因为0x00就等于0啊,但是区分一下
进制数,这样写好一点嘛


        那么,我们的破坏死光就搞定了

        接下来,我们要对 FREQUENCY_STEPS进行调节了,这个很简单,就是按键而已


        我尝试过普通的I/O扫描,如果频率太高,那么扫描IO就不是上策了,所以,用外部中断
是个不错的选择

        外部中断就不详细叙述了,低电平触发,然后,
        第一个按键是FREQUENCY_STEPS++;
        另一个按键是FREQUENCY_STEPS--;
        这个不用说了吧?级数增加减少,很简单,当然,也要稍微做下判断的哇

        FREQUENCY_STEPS>20,就定在20吧
        FREQUENCY_STEPS<0 , 就定在0 吧,上面这么复杂都能理解,这个一定能理解到的


ok,基本代码就确定了。详细看程序


******************************************************************************************
*                                                                                                                                             *
*                                        分析完毕                                                                                           *
*                                                                                                                                             *
******************************************************************************************       


有哪里理解不对还望指导指导!!!!!!                                                            

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2014-3-27 07:45:48 | 显示全部楼层
频率选10KHz的话在某些场合下会发出听觉上的噪声。可以选稍微高一点,但太高了容易造成输出级元器件(比如MOSFET)发热量增加。一般选16KHz比较合适(接近人类听觉上限)。

出0入0汤圆

 楼主| 发表于 2014-3-27 07:49:49 | 显示全部楼层
shandian 发表于 2014-3-27 07:45
频率选10KHz的话在某些场合下会发出听觉上的噪声。可以选稍微高一点,但太高了容易造成输出级元器件(比如M ...

我弄过了,52单片机,才搞到11K的理论,实际8k的仿真频率,如果要16k,要需要高级一点的ic

出0入0汤圆

发表于 2014-3-27 07:52:41 | 显示全部楼层
学习了.

出0入0汤圆

发表于 2014-3-27 07:57:44 | 显示全部楼层
qq开始学单片机 发表于 2014-3-27 07:49
我弄过了,52单片机,才搞到11K的理论,实际8k的仿真频率,如果要16k,要需要高级一点的ic ...

请问11k的理论值怎么来的?

出0入0汤圆

 楼主| 发表于 2014-3-27 07:58:47 | 显示全部楼层
etjason 发表于 2014-3-27 07:57
请问11k的理论值怎么来的?

算出来的

出0入0汤圆

发表于 2014-3-27 13:13:11 | 显示全部楼层
,收藏了。

出145入215汤圆

发表于 2014-4-2 21:53:30 来自手机 | 显示全部楼层
我也做过呼吸灯

出0入0汤圆

发表于 2014-4-10 19:01:52 | 显示全部楼层
讲得到详细,值得学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表