基于AVR单片机的PWM功能设计

发布者:caoxians4589最新更新时间:2019-12-19 来源: elecfans关键字:AVR单片机  PWM  定时  计数器 手机看文章 扫描二维码
随时随地手机看文章

一、定时/计数器PWM设计要点

根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:

1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。


2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。


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

基于AVR单片机的PWM功能设计

PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))

4.快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。


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

PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))


6.相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。当调整占空比时,PWM的相位也相应的跟着变化(Phase Correct)。


7.频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。此时应注意:不仅调整占空比时,PWM 的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase and Frequency Correct)。


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

二、 PWM应用设计参考

下面给出一个设计示例,在示例中使用PWM方式来产生一个1KHz左右的正弦波,幅度为0-Vcc/2。


首先按照下面的公式建立一个正弦波样本表,样本表将一个正弦波周期分为128个点,每点按7位量化(127对应最高幅值Vcc/2):

f(x) = 64 + 63 * sin(2πx/180) x∈[0…127]

如果在一个正弦波周期中采用128个样点,那么对应1KHz的正弦波PWM的频率为128KHz。实际上,按照采样频率至少为信号频率的2倍的取样定理来计算,PWM的频率的理论值为2KHz即可。考虑尽量提高PWM的输出精度,实际设计使用PWM的频率为16KHz,即一个正弦波周期(1KHz)中输出 16个正弦波样本值。这意味着在128点的正弦波样本表中,每隔8点取出一点作为PWM的输出。


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


//ICC-AVR applicaTIon builder : 2004-08

// Target : M128

// Crystal: 8.0000Mhz

#i nclude

#i nclude

#pragma data:code

// 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

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

TIMSK = 0x01; // T/C0溢出中断允许

SEI(); // 使能全局中断

while(1)

{……};

}

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


在ATMEL公司网站上,给出了使用一个定时/计数器实现双音频拨号的应用设计参考(AVR314.pdf),读者可以从中学习到如何更好设计和使用PWM的功能。


f(x) = 64 + 63 * sin(2πx/128) x∈[0…127]

这个问题我也弄过好长一段时间。

在编号为 AVR314 的 Application Note 中,这个讲得很详细。

在这个 note 中,因为正弦波最终用于高、低频的叠加以生成DTMF信号,所以就用了7位来存储正弦表。7位最大为127

而f(x)=sin(x)的值域为[0…1],所以,63 * sin(2πx/128)就放大了值域。

再加64,则将值全部上移为正,满足存储要求。

关键字:AVR单片机  PWM  定时  计数器 引用地址:基于AVR单片机的PWM功能设计

上一篇:基于AVR单片机的ISP1362OTG设计
下一篇:基于AVR单片机的常见问题解答

推荐阅读最新更新时间:2024-11-08 12:52

如何学好AVR单片机介绍
随着各IC厂商推出各种高性能的单片机,51单片机已经远远不能满足大家对高性能单片机的需求。目前很多公司和学校已经开始转向AVR单片机了,相信在未来几年,AVR将会非常兴旺,所以学习AVR单片机将会很有前途。 相比经典的51系列来说, AVR 单片机 突出的优点主要有以下几点: 一、速度快。AVR是精简指令集单片机,其速度可以达到1MIPS/秒,理论上是传统的51的12倍,实际上在10倍左右。 二、片上资源丰富。MEGA系列片上具备JTAG仿真和下载功能。片内含有看门狗电路、片内程序Flash、片内数据RAM、同步串行接口SPI、异步串口UART、内嵌AD转换器、EEPROM、模拟比较器、PWM定时计数器、TWI(IIC)
[单片机]
stm32快速学习6——SysTick 定时1s控制LED
设置使用外部8M晶振 设置引脚功能 设置systick为1s中断 利用systick中断就可以得到1s时间 //////////////////////////////////////////////////////////////////////////前言///////////////////////////////////////////////////////////////////////////////////////// stm32的systick通过少数的程序设置,当使用systick_config()函数之后,其载入值就是你的参数,并且自动打开中断,并将中断设为最低的优先级,将其时钟设为HCLK即系统时钟7
[单片机]
stm32快速学习6——SysTick <font color='red'>定时</font>1s控制LED
主板用的DC to DC脉冲宽度调制(PWM)电路图
: 这是一个三相供电图,Q1和Q2组成一相,Q3和Q4组成一相,Q5和Q6组成一相。每一相都是在PWM 控制 IC(CS5301)的 控制 下,轮流导流的,而不是同时导通。CS5301通过Gate1(H)脚输出控制Q1导通与截止,通过Gate2(L)输出控制Q2的导通与截止。当Gate1(H)输出时,Q1导通,此时Q2截止(Gate1(L)无输出),+12V 端L4及滤波 电容 C15和C16的储能,通过Q1释放并向L1及其后并联的滤波 电容 充电 ,L1储能。当Q1截止Q2导通时,L1上的储能通过Q2向滤波电容 充电 。一相完成一个导通截止期后,下一相再工作。多相轮流工作的好处是,功率管有更多的休息时间,减小了发热。   
[模拟电子]
主板用的DC to DC脉冲宽度调制(<font color='red'>PWM</font>)电路图
STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
概述 本篇文章主要介绍如何使用STM32CubeMX对红外波形进行解码,并通过串口打印。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 选择芯片型号 配置时钟源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示: 配置时钟树 STM32F0的最高主频到48M,所以配置48即可: 串口配置 本次实验使用的串口1进行串口通信,波特率配置为115200。 在这里插入图片描述 定时器配置 本次使用定时器1的通道2进行检测,配置入下。 红外接收管 这里使用VS838的接收管,如下所示: 红外编码 NEC协议载波:38k
[单片机]
STM32CUBEMX(5)--自定义红外NEC解码,<font color='red'>定时</font>器TIM捕获方式
单片机定时器实用方法总结
第一部分:51系列定时器 定时/计数器 0 和定时/计数器1都有4种定时模式。 16位定时器对内部机器周期进行技术,机器周期加1,定时器值加1,1MHZ模式下,一个机器周期为1us 。 定时器工作模式寄存器TMOD,不可位寻址,需整体赋值,高4位用于定时器1,第四位用于定时器0。 C/T:为定时器功能选择位,C/T=0对机器周期计数,C/T=1,对外部脉冲计数。 GATE:门控位,GATE=0,软件置位TRn即可启动计时器,GATE=1需外部中断引脚为高电平时才能软件置位TRn启动计时器,一般取GATE=0。 定时器控制寄存器TCON: TFn:Tn溢出标志位,当定时器溢出时,硬件置位TFn,中断使能的情况
[单片机]
单片机<font color='red'>定时</font>器实用方法总结
stm32f429 中通过基本定时器中断控制LED灯亮一秒、灭一秒
stm32f429中基本定时器有两个,通用定时器有十个,高级定时器有两个。其中基本定时器为TIM6和TIM7。 此处通过编写TIM7定时中断控制LED灯亮灭,TIM6与之类似。 首先可以新建一个.c 和.h 文件,在.c文件中进行TIM7函数定义等,如下图所示: #include bsp_tim_basic.h static void BASIC_TIMx_Mode_Config() { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);//开启时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//结构体
[单片机]
STC单片机PWM的实现方法与原理参考实例
/*============================================================== at12c2052所带的PWM功能演示,内部公用了一个定时器,当启动PWM时PCA 定时器只工作在8位模式,匹配比较器也是按8位的。本程序演示了PWM启动 的设置和调节。 改用在tasking c51下面编译,并尝试了tasking 方便的在线汇编方式 ------- 晓奇 2006.01.12 ===============================================================*/ #include STC12C2052AD.h /*#inc
[单片机]
51片内定时器的应用
利用定时/计数器T1产生定时时钟,由P1口 控制8个发光二极管,使8个指示灯依次一个 一个闪动,闪动频率为10次/秒(8个灯依次 亮一遍为一个周期),循环. 晶振:12MHz stone 2009 04 10 **********************************/ #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define led P0 uint temp,t=0; void main() { EA=1; ET1=1; TMOD=0x10; TH1=-50000/256;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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