找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4347|回复: 0
打印 上一主题 下一主题
收起左侧

AVR单片机相位修正PWM定时器0发生模式试验程序

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-6-23 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*AVR相位修正PWM定时器0发生模式*/
/*PWM波的产生机理是定时器0的TCNT0由0到255,在由255到0,不断地计数,当在0-255计数时TCNT0=OCR0时在OC0引脚上出现低电平,*/
/*当在255-0计数时TCNT0=OCR0时在OC0引脚上出现高电平,当由0加到255,再由255减到0时,产生溢出中断,可以再终端服务中修改OCR0的值,以改变占空比,比用引脚模拟要准确*/
/*另外值得说的是相位修正PWM很适合用在电机控制的场合,他比快速PWM慢,因此它的最大频率要比快速PWM低的多*/
/* 相位修正PWM实验    20110416  天津第四项目部宿舍      王均伟   */
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b)  a|=(1<<b)
#define clr_bit(a,b)  a&=~(1<<b)
#define get_bit(a,b)   a&(1<<b)
uchar i;
#pragma interrupt_handler time0fistpwm_isr:10
void time0fistpwm_isr()//定时计数器0溢出中断
{
    if(OCR0==255)
    {OCR0=0;}//加这个语句是为了在OC0引脚上表现出电压越来越高,灯越来越亮的效果,
OCR0++;      //OCR0越小则OC0引脚电压越低越,换句话说低电平时间越长。

}
void int_time0fistpwm()//定时器0用在相位修正PWM设置初始化
{
     SREG=0x80;//开启全局中断
    TCNT0=0;//
OCR0=0;;//
   TCCR0=0x65; //工作在相位修正PWM模式,当TCNT0由0-TOP时,OCR0=TCNT0时,OC0脚拉低,当TCNT0由TOP-0时,OCR0=TCNT0时,OC0脚拉高,此时计时器继续计数,当TCNTO=0时溢出时,并产生中断,可以在中断里设置下一次的低电平时间,OCR0越小低电平时间越长    OC0引脚(就是4脚),时钟1024分频,开启定时器
   
   TIMSK=0x01;//开启定时器溢出中断
   
}
void main()
{
DDRC=0xff;
PORTC=0x00;
DDRB|=(1<<3);
PORTB|=(1<<3);
int_time0fistpwm();
while(1);


}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表