关于固定频率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,基本代码就确定了。详细看程序
******************************************************************************************
* *
* 分析完毕 *
* *
******************************************************************************************
有哪里理解不对还望指导指导!!!!!! 频率选10KHz的话在某些场合下会发出听觉上的噪声。可以选稍微高一点,但太高了容易造成输出级元器件(比如MOSFET)发热量增加。一般选16KHz比较合适(接近人类听觉上限)。 shandian 发表于 2014-3-27 07:45
频率选10KHz的话在某些场合下会发出听觉上的噪声。可以选稍微高一点,但太高了容易造成输出级元器件(比如M ...
我弄过了,52单片机,才搞到11K的理论,实际8k的仿真频率,如果要16k,要需要高级一点的ic 学习了. qq开始学单片机 发表于 2014-3-27 07:49
我弄过了,52单片机,才搞到11K的理论,实际8k的仿真频率,如果要16k,要需要高级一点的ic ...
请问11k的理论值怎么来的? etjason 发表于 2014-3-27 07:57
请问11k的理论值怎么来的?
算出来的 {:handshake:},收藏了。 我也做过呼吸灯 讲得到详细,值得学习
页:
[1]