AVR 相位修正PWM模式应用

发布者:BoldDreamer最新更新时间: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模式 引用地址:AVR 相位修正PWM模式应用

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

推荐阅读最新更新时间:2024-03-16 15:14

AVR单片机驱动CH451实例程序_C语言
1) CH451简介 CH451可用于LED数码管显示驱动、键盘扫描控制、μP监控电路等领域。芯片封装包括双列直插DIP28、SOP28以及DIP24S封装。其内置RC振荡电路,可以直接动态驱动8位数码管或者64位LED,具有BCD译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。CH451内置大电流驱动级,段电流不小于30 m A,字电流不小于160mA,并有16级亮度控制功能。该器件内置64键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断与按键释放标志位等功能。CH451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位
[单片机]
<font color='red'>AVR</font>单片机驱动CH451实例程序_C语言
AVR操作EEPROM应注意的问题
简介:本文介绍了AVR单片机在实际使用时电源检测的问题。 作为一个正式的系统或产品,当系统基本功能调试完成后,一旦进行现场测试阶段,请注意马上改写熔丝位的配置,启用AVR的电源检测(BOD)功能。 对于5V系统,设置BOD电平为4.0V;对于3V系统,设置BOD电平为2.7V。然后允许BOD检测。 这样,一旦AVR的供电电压低于BOD电平,AVR进入RESET(不执行程序了)。而当电源恢复到BOD电平以上,AVR才正式开始从头执行程序。保证了系统的可靠性! 原因分析如下: AVR是宽电压工作的芯片,当电压跌至2.5V,系统程序还能工作。这是有2个可怕的现象可能出现, 1、外围芯片工作已经混乱,AVR读到的东
[单片机]
AVR ISP
1、ISP下载说明: 2、配置时钟熔丝: 时钟不可乱配置,最好是内部或是外部晶震,配置成其它的有可能会锁死ISP,如果锁死只能用外加时钟(8MHz以下的)才可以ISP,M8没有Jtag。
[单片机]
<font color='red'>AVR</font> ISP
AVR单片机ATmega8内部晶振使用
ATmega8在使用内部晶振的时候,需要进行烧写方式的选择,来选择不同内部晶振大小。 对应UART的波特率设置和使用外部晶振的方式是一样的。 但是一般情况下,不建议使用内部晶振,因为内部晶振的精度不高,会因为温度等外部环境的影响,使得不准确。
[单片机]
AVR单片机寄存器DDR,PORT和PIN之间对应关系
AVR单片机每一个I/O口都对应3个寄存器DDRx,PORTx和PINx,其中DDRx为数据方向,即输入或输出;PORTx为将内部上拉电阻的状态,PINx为读取的外部引脚的状态.以下是三者对应关系:(假设DDRx.n,PORTx.n如下,PINx.n悬空) 0 0 x : 输入, 高阻态, PINx.n的值不确定. 0 1 1 : 输入, 上拉, 值为1. 1 0 0 : 输出0, 无拉. 1 1 1 : 输出1, 上拉. 代码实例: #include mega16.h void main(void) { unsigned char result; PORTA = 0b1111
[单片机]
ATtiny13 掉电模式
当 SM1..0 为 10 时,SLEEP 指令将使 MCU 进入掉电模式。在此模式下,外部晶体停振, 而外部中断及看门狗(如果使能的话)继续工作。只有外部复位、看门狗复位、BOD 复 位、外部电平中断 INT0 或引脚变化中断可以使 MCU 脱离掉电模式。这个睡眠模式停止 了所有的时钟,只有异步模块可以继续工作。 当使用外部电平中断方式将 MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。具 体请参见 P51“ 外部中断 ” 。
[单片机]
ATtiny13 掉电<font color='red'>模式</font>
IAR For AVR 定时器溢出中断 (使用小结)
关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。对于定时器初值的设定可以加深对定时器的工作原理的理解。 ATMega16 里面有8位和16位两种定时器,他们何时会溢出这个是固定的,也就是到达他们的计数范围的最大值就会产生中断,8位的定时器的最大计数范围是0~256(2的8次方),就是累加到256后他就会产生中断,16位的定时器最大计数范围是0~65536(2的16次方),累加到65536时他就会产生中断。 而我们所谓的计数初值是就是要设定定时器在什么地方开始计数,以8位定时器为例比如:初值为100,所以定时器从100开始累加,累加了156次,加到256后产
[单片机]
IAR For <font color='red'>AVR</font> 定时器溢出中断 (使用小结)
爱特梅尔推出带有集成LCD控制器的AVR XMEGA系列
爱特梅尔公司(Atmel® Corporation)宣布将LCD控制器加入广受欢迎的AVR® XMEGA®微控制器(MCU)系列器件中。将LCD控制器集成进MCU能够帮助设计人员减低设计复杂性和总体系统成本,同时为智能仪表、家庭自动化、电动工具和其它需要用户界面的应用提供超低功耗特性。 带有集成LCD控制器的AVR XMEGA系列整合了在LCD显示器上运行图块所需的全部特性,降低了整体设计复杂性。这些器件还包括一个能够实现LCD信号内部重路由(re-routing)的创新SWAP模式,帮助设计人员简化PCB设计和减低复杂性。这些AVR XMEGA微控制器采用爱特梅尔 picoPower®技术,能够实现超低功耗,新器件所用的电流
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved