《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

AVR使用范例--定时器实现PWM功能
pcbomb 发表于 2007-11-1 8:43:00  阅读全文 | 回复(1) | 引用通告 | 编辑

AVR使用范例--定时器实现PWM功能

本页关键词: 什么是pwm pwm原理 pwm控制 pwm芯片 pwm 单片机 单片机pwm控制应用 pwm电路 pwm输出 pwm调制

脉宽调制PWM是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。

通俗的说PWM就是波形,波形的波峰以波谷的比例关系成为占空比,我们可以通过PWM控制电机,音量控制,模拟控制等。

AVR单片机的定时器可以轻松实现PWM功能。mega16和mega32的timer0是和timer2都具有PWM功能,timer0和timer2都为8位定时器。timer2为异步操作定时器,在操作过程中要等待寄存器状态更改完成。详情参看数据手册:8位有pwm操作的异步操作定时器timer2。

下图设定使用timer0来实现PWM功能。PWM电机控制:访问AVR与L298进行直流电机控制

Timer设置PWM

OC0 output mode 设定了pwm输出控制选择:正常的端口操作,不与OC0 相连接, 比较匹配发生时OC0 取反, 比较匹配发生时OC0 清零, 比较匹配发生时OC0 置位。

Waveform mode设定了波形产生模式:比较匹配输出模式,快速PWM 模式,相位修正PWM 模式。更详细的内容请参看数据手册。

看看程序代码:下载相关文件

//ICC-AVR application builder : 2006-11-25 0:15:12
// Target : M16
// Crystal: 7.3728Mhz

#i nclude 
#i nclude 

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 DDRB  = 0x08; //PB3为PWM输出,非常重要,否则无法输出波形
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1KHz
// actual value:  1.002KHz (0.2%)
void timer0_init(void)
{
 TCCR0 = 0x00; //stop
 TCNT0 = 0x8D; //set count /*TCNT0*/
 OCR0  = 0x73;  //set compare /*OCR0*/
 TCCR0 = 0x23; //start timer /*TCCR0*/
}

#pragma interrupt_handler timer0_comp_isr:20
void timer0_comp_isr(void)
{
 //compare occured TCNT0=OCR0
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 TCNT0 = 0x8D; //reload counter value
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer0_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x03; //timer interrupt sources /*TIMSK*/
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void main(void) /*加上这些,程序就可以运行了。*/
{
 init_devices();
 while(1)
 ;
}

程序运行效果:

Timer0生成的PWM波形

波形从PB3输出:

PWM连接图

看看几个关键的寄存器的意义:

  1. TCNT0:定时器计数值,定时过程中不断增大,溢出后重新置数,开始下一轮。
  2. OCR0:定时器比较的值,当TCNT0 =OCR0时,会产生timer0_comp_isr中断。
  3. TCCR0:控制timer0的寄存器,这里0x23代表的是:

    TCCR0 详细情况

    波形产生模式为普通模式,比较匹配发生时OC0 清零,clkI/O/64 ( 来自预分频器),详细内容请查看数据手册。

    • TIMSK:定时器中断选项,这里允许timer0比较中断,溢出中断。
    • 预分频器:预分频器是独立运行的。也就是说,其操作独立于T/C 的时钟选择逻辑,且它由T/C1 与 T/C0 共享。由于预分频器不受T/C 时钟选择的影响,预分频器的状态需要包含预分频时钟 被用到何处这样的信息。一个典型的例子发生在定时器使能并由预分频器驱动(6 > CSn2:0 > 1)的时候:从计时器使能到第一次开始计数可能花费 1 到N+1个系统时钟周期, 其中N 等于预分频因子(8、64、256 或1024)。

    PWM的工作流程:

    1. 初始化,定时器开始工作,TCNT0逐渐增大,在预分频这么多个时钟周期里变化一次。
    2. 输出比较寄存器包含一个8 位的数据,不间断地与计数器数值TCNT0 进行比较。匹配事件可以用来产生输出比较中断,或者用来在OC0 引脚上产生波形。
    3. TCNT0溢出,溢出中断用于在OC0上产生波形,置位或者清零。
    4. TCNT0复位,进行下一次定时操作。

    PWM的占空比:

    调节PWM的占空比,只需要用程序更改OCR0的值即可,根据不同的情况,可能是增加也可能是减小。注意:因为Timer2是异步控制器,使用Timer2时,调节OCR2需要等待寄存器更新完成才能进行其他操作。

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    Re:AVR使用范例--定时器实现PWM功能
    AVRVi发表评论于2007-12-13 17:02:00  个人主页 | 引用 | 返回 | 删除 | 回复

    AVRVi我的

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    发表评论:
    载入中...

    芯片专题

    器件专题

    软件专题

    硬件专题

    综合专题

    项目专题

    原创专题

    器件检测
    LCD LED
    按键 触摸键
    E2PROM
    电池 电机
    电阻 电容 电感

    指令系统
    软件算法
    编程规范
    滤波算法
    串行通讯

    PCB设计
    I2C PWM
    红外遥控
    充电技术
    中断 ADC 

    匠人手记
    匠人夜话
    网络心路
    一周热点串烧
    从零开始玩PIC
    DIY旋转时钟

    广告5号位 [投放]


    学习板、开发板、编程器、下载器、仿真器(查看详情……)

    广告3号位 [投放]

    站内搜索


    站外搜索


    百度  google
    mp3  歌词 
    图片  FLASH 
    知道  文档
    新闻  词典 
    地图  mp3 
    软件  天网 
    雅虎  爱问 
    搜狗  讯雷 
    网讯  华军 
    天空 

    21IC器件搜索
    百宝箱分站
  4. 《匠人的百宝箱》21IC站
  5. 《匠人的百宝箱》21IC笔记团队
  6. 《匠人手记》21IC书友会
  7. 《匠人的百宝箱》MCUBLOG站
  8. 《匠人的百宝箱》MCUBLOG笔记团队
  9. 《匠人的百宝箱》EDN站
  10. 《匠人手记》EDN书友会
  11. 《匠人的百宝箱》与非网站
  12. 《匠人的百宝箱》新浪站
  13. 《匠人的百宝箱》百度站
  14. 《匠人的百宝箱》网易126站
  15. 《匠人的百宝箱》网易163站
  16. 《匠人的百宝箱》互动出版网站
  17. 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!