qq开始学单片机 发表于 2014-3-27 07:33:44

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

******************************************************************************************
*                                                                                        *
*                        关于固定频率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 charOUTPUT_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)

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


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

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


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

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

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


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


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


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

shandian 发表于 2014-3-27 07:45:48

频率选10KHz的话在某些场合下会发出听觉上的噪声。可以选稍微高一点,但太高了容易造成输出级元器件(比如MOSFET)发热量增加。一般选16KHz比较合适(接近人类听觉上限)。

qq开始学单片机 发表于 2014-3-27 07:49:49

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

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

lryxr2507 发表于 2014-3-27 07:52:41

学习了.

etjason 发表于 2014-3-27 07:57:44

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

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

qq开始学单片机 发表于 2014-3-27 07:58:47

etjason 发表于 2014-3-27 07:57
请问11k的理论值怎么来的?

算出来的

wushifeng 发表于 2014-3-27 13:13:11

{:handshake:},收藏了。

dz20062008 发表于 2014-4-2 21:53:30

我也做过呼吸灯

help_me! 发表于 2014-4-10 19:01:52

讲得到详细,值得学习
页: [1]
查看完整版本: 关于固定频率PWM 占空比可调的个人理解!!!!