第一篇: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频率的计算公式为:
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
#Include
#Include
#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为计数器的上限值。
第二篇:AVR单片机定时器TC0定时操作过程
定时器T/C0定时功能实现过程
一、中断总使能:SREG=0X80;
二、使能定时器溢出中断,TIMSK的TOIE0置1
三、选择定时器时钟分频系数,由TCCR0的CS01,CS01,CS00决定。
四、定时器计数器付初始值,TCNT0=61,TCNT0位8位寄存器,计数范围为0-255,付初始值61后,从61开始计数到255时产生溢出中断
付初值后定时就开始工作。
定时时间计算:每个计数时钟脉冲的时间T=1/f,f=晶振频率/分频系数,如晶振为8MHZ,分频系数为1024,则定时器器时钟
频率为f=8000000HZ/1024=7812.5HZ,单个时钟脉冲时间:T=1/f=1/7812.5=0.128ms(毫秒),T/C0最大的计数值 为256,最大计时时间为256*0.128ms=32.768ms。
定时器初值计算公式:定时器初值=256-定时时间/单个时钟脉冲时间: 如定时25ms,初值=256-25ms/0.128ms=256-195=61
注:1MHZ=1000KHZ=1000000HZ,1s(秒)=1000ms(毫秒)
/***************************************************************************************
函数功能:定时器T/C0实现1秒钟定时,控制发光二极管周期性亮灭,晶振8MHZ
***************************************************************************************/
#include
char Counter = 0;// 1S计数变量清零,变量声明
/********端口初始化********/
void port_init()//端口初始化子函数
{
PORTA=0xFF;//PA口配置为输出
DDRA=0xFF;//PA口初始值为“1”
}
/********定时器0初始化********/
void timer0_init()//因为定时时间太短,看不到灯的变化
{
SREG = 0x80;//使能全局中断
TIMSK|=(1< TCCR0|=(1< TCNT0 = 61;//定时初值设置,定时时间 =(256-61)/7812.5=25ms } /********主函数********/ void main() { port_init(); timer0_init(); while(1); } /********定时器0中断服务函数********/ #pragma interrupt_handler timer0_ovf:10 void timer0_ovf(void) { TCNT0 =61;//重装计数初值 if(++Counter >= 40)//定时时间到1S吗?定时中断溢出40次为1S,25ms*40=1000ms=1s(秒){ PORTA^=BIT(0);//,将PA口的第0位取反操作。 Counter = 0;//1S计时变量清零 } } 小企鹅diy科学探究学习网 更多相关文章转到: http://hi.baidu.com/wqb_lmkj/blog文章分类下的单片机 实现功能:通过键盘(BUTTON)控制蜂鸣器发生,键盘按下,通过RC2/CCP1接口输出PWM信号(频率880Hz,脉宽50)驱动蜂鸣器发声。 实验环境: Proteus 编程语言: 汇编 编程环境: MPLAB 单片机: 晶振: PIC16F877 20MHz Proteus仿真电路如图。 实验源程序: LIST P=16F877;设置pwm为880Hz,50%占空比 INCLUDE P16F877.INC ORG 0000H START BANKSEL TRISC;进入TRISC所在BANK BCF TRISC,2;清零TRIC的bit2,以使CCP1引脚成为输出 MOVLW D'70' MOVWF PR2;将70写入PR2以设置PWM周期 BANKSEL CCPR1L MOVLW D'35' MOVWF CCPR1L MOVLW 0X06 MOVWF T2CON;bit2=1,使能Timer2,bit1-1,预分频值为16 CHECKBUTTON BTFSC GOTO PORTA,4 BUTTONOFF BUTTONON MOVLW H'0C' MOVWF CCP1CON;设置CCP1为PWM模式 GOTO CHECKBUTTON BUTTONOFF CLRF CCP1CON GOTO END CHECKBUTTON 基于AVR单片机Mega16的时钟设计报告 1摘 要 近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此越来越广泛地应用各个领域.本文的电子钟系统是以单片机(ATmega16)为核心,时钟芯片、数码管显示驱动芯片等元器件组成。具体介绍应用Proteus的ISIS软件进行单片机系统的电子钟设计与仿真的实现方法。该方法既能准确验证所设计的系统是否满足技术要求,又能提高系统设计的效率和质量,降低开发成本,具有推广价值。 关键词:单片机; 时钟芯片 ;数码管显示驱动芯片 ;电子钟 2引 言 单片机电子时钟系统可以用多种技术手段实现。本文借助于Proteus仿真系统进行系统虚拟开发成功之后再进行实际操作,可以节约开发时间,降低开发成本,具有很大的灵活性和可扩展性。在国外有包括斯坦福、剑桥等在内的几千家高校将Proteus作为电子工程学位的教学和实验平台;在国内也有众多大学正在体验Proteus的独一无二的功能并申报大学计划。该方法具有普遍意义。通过实际应用发现,采用该方法可以大大简化硬件电路测试和系统调试过程中电路板制作、元器件安装、焊接等过程。很明显,使用该方法可以提高开发效率、降低开发成本、提升开发… AVR系列的单片机不仅具有良好的集成性能,而且都具备在线编程接口,其中的系列还具备仿真和下载功能;含有片内看门狗电路、片内程序FLASH、同步串行接口SPI;多数AVR单片机还内嵌了A/D转换器、EEPROM、模拟比较器、PWM定时计数器等多种功能;AVR单片机的I/O接口具有很强的驱动能力,灌人电流可直接驱动继电器、LED等元件,从而省去驱动电路,节约系统成本。 3设计思路 利用单片机(ATmega16)制作简易电子时钟,由六个LED数码管分别显示小时十位、小时个位、分钟十位、分钟个位、秒钟十位、秒钟个位。6个PNP管分别控制六个数码管的亮灭,此外还可以实现时间调整、等多种实用功能。整个设计分硬件和软件两大部分。硬件部分采用MEGA16单片机作为可编程芯片,字符液晶作为信号显示;软件部分利用C语言作为设计语言,对MEGA16进行编程实现各种功能。 硬件设计电路分解为单片机、晶体振荡器和数码管3个部分,其结构简单,经济实惠。单片机内部晶体振荡器的外接电路。由两个电容和晶体振荡器构成,其电路如图1所示。图中X1和X2分别接MEGA16的两个脉冲控制端,使得MEGA16的内部脉冲电路为电子时钟和整个系统时钟提供脉冲。 图1所示给出了采用单片机外加电源及晶体振荡器构成最小单片机系统。配合单片机开发的设计、调试和下载,最终将时钟信息从端口输出到字符液晶显示。 图26位模式与单片机的端口相连。 4软件设计及调试过程 软件设计包括Proteus的ISIS软件、Code Vision AVR编辑软件和AVRStudio4调试。利用ISP将生成程序timer.cof 下载到目标板。其主要程序如下: void display(void)// 6 位LED 数码管动态扫描函数 { PORTC = 0xff; PORTA = led_7[dis_buff[posit]]; if(point_on &&(posit==2||posit==4))PORTA |= 0x80; PORTC = position[posit]; if(++posit >=6)posit = 0; } // Timer 0 比较匹配中断服务 interrupt [TIM0_COMP] void timer0_comp_isr(void) { display();// 调用LED 扫描显示 if(++time_counter>=100) { time_counter = 0; time_1s_ok = 1; } } void time_to_disbuffer(void)// 时钟时间送显示缓冲区函数 { char i,j=0; for(i=0;i<=2;i++) { dis_buff[j++] = time[i] % 10; dis_buff[j++] = time[i] / 10; } } // INT0 中断服务程序 interrupt [EXT_INT0] void ext_int0_isr(void) { if(++time[2]>=24)time[2] = 0; } // INT1 中断服务程序 interrupt [EXT_INT1] void ext_int1_isr(void) { if(++time[1]>=60)time[1]=0; } void main(void) { PORTA=0x00;// 显示控制I/O 端口初始化 DDRA=0xFF; PORTC=0x3F; DDRC=0x3F;// T/C0 初始化 PORTA=0xFF; DDRA=0xFF; GICR|=0xC0;// 允许INT0、INT1 中断 MCUCR=0x0A;// INT0、INT1 下降沿触发 GIFR=0xC0;// 清除INT0、INT1 中断标志位 TCCR0=0x0B;// 内部时钟,64 分频(4M/64=62.5KHz),CTC 模式 TCNT0=0x00; OCR0=0x7C;// OCR0 = 0x7C(124),(124+1)/62.5=2ms TIMSK=0x02;// 允许T/C0 比较匹配中断 time[2] = 14;time[1] = 01;time[0] = 55;// 设时间初值23:58:5 5posit = 0; time_to_disbuffer(); #asm(“sei”)// 开放全局中断 while(1) { if(time_1s_ok)// 1 秒到 { time_1s_ok = 0; point_on = ~point_on; if(++time[0] >= 60)// 以下时间调整 { time[0] = 0; if(++time[1] >= 60) { time[1] = 0; if(++time[2] >= 24)time[2] = 0; } } time_to_disbuffer();// 新调整好的时间送显示缓冲区 5总结心得 这次设计报告培养了学生综合运用所学知识,发现,提出,分析和解决问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 回顾起此次单片机设计,我仍感慨颇多,的确,从选题到定稿,从理论到仿真,在这些日子里,我学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。 这次设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师那里我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! }结束语 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。尤其是AVR单片机可以用高级语言编程,极容易地实现系统移植,并且加快了软件的开发过程。这次设计通过对它的学习、应用,以Mage16单片机为核心,辅以必要的电路,采用高级C语言编程,设汁了一个简易的电子时钟,由 4.5 V直流电源供电,通过数码管能够准确显示时间。 引言 定时器根据其发展历程可以分为:一种是基于模拟技术的定时器,目前这种产品已经退出市场中;另一种是基于数据技术的产品,其具有强大的产品功能,但是这种产品主要应用于较大的设备中。随着单片机技术的不断发展,基于单片机的多用途定时器被越来越多的行业所应用,因此本文通过单片机多用途定时器的设计进行深入的分析,让人们更加了解基于单片机的多用途定时器的设计体系。 1基于单片机的多用途定时器的设计需求 通过单片机多用途定时器可以在LED显示器中显示预定的时间以及当前的时间,进而让人们可以清楚地知道定时器工作的状态等。同时基于单片机多用途定时器所具有的报警功能也可以及时提醒人们,进而为人们的生活、生产提供便利。当单片机定时器达到预定的时间后,该系统就会发出警报,给人以提醒,因此单片机多用途定时器的便利性为设计该产品提供了广泛的市场需求。 2单片机多用途定时器的设计原理 单片机多用途定时器主要采取了M SP430系列单片机、键盘、钟芯片DS1302以及电源等电子模块而实现的,由于其性价比比较高,因此其具有广泛的市场应用前景。结合多年的经验,该产品的设计原理主要如下: 2.1 M SP430系列单片机的结构 M SP430系列单片机主要包括CPU、存储器以及外围模块等组成:CPU主要是用来处理程序指令,存储系统的相关数据与程序,并且进行位、字、字节的操作。外围模块主要是将单片机与外围的相关设备进行链接,并且实现通道的采样转换。 2.2单片机多用途定时器的设计原理 该设计主要是将M SP430单片机的各个端口与时钟电路、键盘电路以及显示电路进行连接,通过软件程序实现与硬件电路的连接,进而实现定时器的定时、报警功能。纵观整个单片机定时器设计过程,软件系统中的中断系统程序是设计的关键,在预定设计好定时信息后要注意将各个端口的自动中断处理,键盘的程序设计主要是采取扫描法,通过判断行与列的键盘输入信号来确定键入数字。 3基于单片机的多用途定时器的实现 3.1硬件设计 定时器的硬件设计主要包括:时钟电路、M SP430单片机、显示器以及键盘电路,其设计原理就是将单片机与各个硬件设备相连,实现电压与电平之间的转变,因此在电路设计时要充分考虑各个器件引脚的功能,对于重点电路可以先进行理论探讨后再进行搭建。 在硬件设计中时钟模块是设计中比较复杂的,其主要是时钟中的实时时钟与RAM,利用串行接口与单片机进行通信,给电路提供实时的时间信息。时钟操作可通过AM h'M指示采用12/24小时格式。用RES(复位),SCLK(串行时钟)、功(数据线)、三个口线与单片机之间进行同步串行通信。时钟电路部分是整个系统设计的难点,电路搭建的正确与否直接关系着定时器时钟系统是否能够正常运行。 其次是键盘模块主要采用扫描方式进行。键盘的工作方式也是分为两种,编程控制方和中断控制方式,一般是采用矩阵式键盘设计。首先设置各个口线为输入模式,通过中断的方式或者软件查询的方式,获取信息,从而知道各个口线是否有键按下,如果有键按下,则口线端口为高电平,否则为低电平。在按下设置键对时间进行调整之前可以通过+、一按键进行调节。扫描键盘一般由行和列组成,在键盘上的某条行线上输入低电平,如果键盘中某个键被按下则某个列线变为低电平。 3.2软件设计 本文定时器的软件设计,用于软件程序的调试与仿真所使用的是TARSystem s公司开发的软件,其包含C/C++编译器和调试器的集成开发环境。结合本次的定时器产品设计主要采取的是THREW 430软件程序。首先,在程序编写之前要打开TAR Em bedded W oxRbench,注意单击菜单Project,Add file test出现需要的加载源文件界面,选择相应的界面类型,编译时注意对430单片机型号进行选择;其次,在程序运行时要对DS1302进行设置,并对D S 1302系统进行初始化优化,并将系统的时间设置为0。在确保上述程序完成后,再进行时间上传,进而将有效的信息存储在EPROM中,并且将其上传给管理层,管理层在接收到相关知识后再进行相应的修改,最后显示出具体的时间;最后,LED数码管在显示之前,要对串口的工作方式进行设置,然后设置对应的地址指针,然后选择数段码,通过传送过来的脉冲来显示。 参考文献: [1 ]胡立群,陈敦军,吴凡超.基于单片机的多通道控制器的设计[U].电子测量技术,2014(01).[2 ]罗大军.基于单片机定时器的研究田科技致富向导,2011(09).[3 ]哲豪.新版多用途定时器的硬件设计田.机电信息,201002).第三篇:PIC单片机学习笔记之PWM信号输出
第四篇:AVR单片机的时钟设计(范文)
第五篇:基于单片机的多用途定时器的设计分析论文