datasheet

AVR 相位修正PWM模式应用

2016-10-09来源: eefocus关键字:AVR  相位修正  PWM模式
       在LED类灯具的设计中,RGB调光是一非常重要的一个方面.

      为节省成本,一般多选用Mega8或Mega16.简单的处理方法是用I/O管脚模拟PWM,但实现灰度调光时候特别实现Fade功能时,容易出现抖动,这是因为人眼对42Hz以下的频率敏感的原因.

    最好的办法是采用PWM方式.

   1:AVR 定时/计数器的PWM
模式可以分成快速PWM和频率(相位)调整PWM 两大类。

快速PWM 可以的到比较高频率的PWM 输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程
正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。PWM 频率
的计算公式为:
PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))

    频率(相位)调整PWM 模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数
方式。同样计数器的上限值决定了PWM 的频率,比较匹配寄存器的值决定了占空比的大小。PWM 频率的计
算公式为:
PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))

 

    在PWM 方式中,计数器的上限值有固定的0xFF(8 位T/C);0xFF、0x1FF、0x3FF(16 位T/C)。或由用
户设定的0x0000-0xFFFF,设定值在16 位T/C 的ICP 或OCRA 寄存器中。而比较匹配寄存器的值与计数器上
限值之比即为占空比。

2:应用例子

   用PWM 方式来产生一个1KHz 左右的正弦波,幅度为0-Vcc/2。

   程序中使用ATmega128 的8 位T/C0,工作模式为相位调整PWM 模式输出,系统时钟为8MHz,分频系
数为1,其可以产生最高PWM 频率为: 8000000Hz / 510 = 15686Hz。每16 次输出构成一个周期正弦波,正弦
波的频率为980.4Hz。PWM 由OC0(PB4)引脚输出。参考程序如下(ICCAVR)。

//ICC-AVR application builder : 2009-04

// Target : M128
// Crystal: 8.0000Mhz
#include
#include
#pragma data:code //随后的数据存放在Flash区域
// 128 点正弦波样本表
const unsigned char auc_SinParam[128] = {
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,
123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,
117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,
45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,
7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};


#pragma data:data//随后数据放在RAM区


unsigned char x_SW = 8,X_LUT = 0;
#pragma interrupt_handler timer0_ovf_isr:17//中断常量表位置


void timer0_ovf_isr(void)
{
X_LUT += x_SW; // 新样点指针//学习此种编程风格
if (X_LUT > 127) X_LUT -= 128; // 样点指针调整
OCR0 = auc_SinParam[X_LUT]; // 取样点指针到比较匹配寄存器
}

 


void main(void)
{
DDRB |= 0x10; // PB4(OC0)输出
TCCR0 = 0x71; // 相位调整PWM 模式,分频系数=1,正向控制OC0

 

/*

TCCR0
? Bit 7 – FOC0: 强制输出比较
FOC0仅在WGM指明非PWM模式时才有效。但是,为了保证与未来器件的兼容性,在使
用PWM 时,写TCCR0 要对其清零。对其写1 后,波形发生器将立即进行比较操作。比
较匹配输出引脚 OC0 将按照COM01:0 的设置输出相应的电平。要注意FOC0 仅仅是一
个启动信号,真正对强制输出比较起作用的是COM01:0 的设置。
OCFn
OCRn
TCNTn
OCRn Value
OCRn - 1 OCRn OCRn + 1 OCRn + 2
clkI/O
clkTn
(clkI/O/8)
OCFn
OCRn
TCNTn
(CTC)
TOP
TOP - 1 TOP BOTTOM BOTTOM + 1
clkI/O
clkTn
(clkI/O/8)
Bit 7 6 5 4 3 2 1 0
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 TCCR0
读/ 写W R/W R/W R/W R/W R/W R/W R/W
初始值0 0 0 0

Cs2,Cs1,Cs0 =1,预分频系数为1

WGM01 WGM00=1 相位校正PWM模式


AVR 相位修正PWM模式应用 - 蓝眼泪 - 蓝眼泪的博客

*/
TIMSK = 0x01; // T/C0 溢出中断允许
SEI(); // 使能全局中断
while(1)
{……};
}
每次计数器溢出中断的服务中取出一个正弦波的样点值到比较匹配寄存器中,用于调整下一个PWM 的脉
冲宽度,这样在PB4 引脚上输出了按正弦波调制的PWM 方波。当PB4 的输出通过一个低通滤波器后,便得
到一个980.4Hz 的正弦波了。如要得到更精确的1KHz 的正弦波,可使用定时/计数器T/C1,选择工作模式
10,设置ICR1=250 为计数器的上限值

关键字:AVR  相位修正  PWM模式

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016100930245.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:触摸屏LED彩色台灯的设计
下一篇:AVR 编程之矩阵键盘

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR单片机——中断系统

中断的优点中断函数只在中断触发源触发的时候才会执行,其他时间不执行. 如果不使用中断而且如果要根据某个端口的变化而作相应的函数操作,就必须不断地查询端口的信号,而中断不用,只要端口一有变化,就会系统就会自动进入中断函数, 我觉得这就是中断的目的,也是优点.中断优先级1) AVR单片机在同一个优先级中,中断向量入口地址越低,其优先级越高。AVR单片机在响应中断以后,会禁止系统响应其余中断。如果程序需要在某个中断服务程序中响应其它中断事件,可以在该中断服务程序中用重新使能全局中断即可。否则,AVR单片机只有在退出中断进程时,才重新使能全局中断。2) AVR(至少是ATmega16)单片机采用固定的硬件优先级方式,不支持通过软件
发表于 2018-11-20
AVR单片机——中断系统

高手总结!AVR单片机学习笔记

下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。1、  AVR单片机采用RISC架构,8051单片机采用CISC架构。前者速度为后者的2~4倍,为流水线操作指令2、  AVR单片机有32个通用寄存器(地址在RAM区从$0000开始到$001F),其中有6个(最后6个)合并为3个16位的X,Y,Z寄存器,用来存放地址指针,Z寄存器还可以寻址程序存储器3、  哈佛结构,131条机器指令4、  延迟开机功能5、  内部自带RC振荡器,可提供1/2/4/8MHZ的工作时钟6、 
发表于 2018-11-20

单片机抗干扰能力那家强?PIC、AVR....

单片机的抗干扰性能历来为大家所重视,现在市面上的单片机就我所接触过的,就有十家左右了,韩国的三星和现代;日本的三菱,日立,东芝,富士通,NEC;台湾的EMC,松汉,麦肯特,合泰;美国的摩托罗拉,国半的cop8系列,microchip系列,TI的msp430系列,AVR系列,51系列,欧洲意法半导体的ST系列。。。。。。这些单片机的抗干扰性能大多数鄙人亲自测试过,所用机器是上海三基出的两种高频脉冲干扰仪,一种是欧洲采用的标准,一种是日本采用的标准;日本的标准歉咂德龀辶⒊觯龀蹇矶却?0ns到250ns可调,欧洲采用的标准是脉冲间歇(间歇时间和发出时间可调)发出,脉宽也是从50ns到250ns可调;我们国家采用的是欧洲标准。一般
发表于 2018-11-20

AVR Mega8 V-USB general & multimedia keys via IR transmitor

(2)段)reportBuffer[1],0位USAGE (Volume Decrement);1位USAGE (Volume Increment);2位USAGE (Track Next);3位USAGE (Track Previous);4位USAGE (Play/Pause)reportBuffer[2] 没有用到。在report id为 2 报告发送函数:usbSetInterrupt((void *)&reportBuffer, 2); //因为只定义了两个字节的报告数据实验中IR处理用了AVR的ICP。需要注意的是,发送按键HID报告后,紧接着发送同类型的零数据HID报告
发表于 2018-10-17
AVR Mega8 V-USB general & multimedia keys via IR transmitor

AVR Mega16 PAL/NTSC制式 B/W 信号模拟

资料参考http://www.rickard.gunee.com/projects/video/pic/howto.phphttp://tinyvga.com/avr-sdram-vgahttp://www.serasidis.gr/circuits/colour_bar_gen/colour_bar_gen.htmhttp://belogic.com/uzebox/index.asp以下引用自 http://eyetap.org/ece385/lab5.htmSEQUENCE:Horizontal sync (hsync) pulse: Start each scanline with 0.3V, then 0V
发表于 2018-10-17
AVR Mega16 PAL/NTSC制式 B/W 信号模拟

AVR使用范例--使用Bootloader 升级芯片内程序详解

Bootloader是flash中高地址的一个程序区域,通过它可以实现程序的运行控制,程序更新等。本页给出的是通过串口实现在线更新的方法。程序编译环境:icc avr 6.31。如果你使用Atmega16芯片,7.3728M晶振,1024的bootloader区,19200的波特率,那么你直接使用下面的hex文件就可以了,下载hex文件。本站的开发板内,预制这个hex文件,可以按照本页的方法用串口线直接更新程序。否则,你需要对程序进行调整,然后重新编译Bootloader的hex文件,下载软件包,软件中需要更改的部分:芯片的类型#include //选择对应的芯片Bootloader区的大小,和ICC的option相对
发表于 2018-10-15
AVR使用范例--使用Bootloader 升级芯片内程序详解

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved