原创 AVR128学习之可调PWM

2011-2-25 12:56 2378 7 9 分类: MCU/ 嵌入式

说明:本例子采用的是AVR128单片机的定时器T0,利用CTC模式产生的PWM,通过按键可以调节PWM的占空比,其中可调的频率范围是15K--5M(但是高达5M的时候由于没有外加的滤波稳性电路,所以方波看上去会有毛刺)。
    在用示波器调试的时候我老是调不了占空比,也就是更新不了OCR0的值,后来查阅AVR128的技术文档发现,在T0的CTC模式下面更新OCR0的值是要在比较匹配中断的服务程序里面。希望大家以后写的时候要注意更新你的寄存器的时间!

代码如下:(使用内部晶振8M)
编译环境: ICCAVR

#include<iom128v.h>
#include<macros.h>

#define  uint unsigned int
#define uchar unsigned char

#define S5 4
#define S6 5
#define S7 6
#define S8 7       //按键定义

#define KEY_PORT PORTD //按键端口
#define KEY_PIN PIND
#define KEY_DDR DDRD

#define BUZZ_PORT PORTG
#define BUZZ_PIN PING
#define BUZZ_DDR DDRG //蜂鸣器端口

#define SPK 4  //蜂鸣器

void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
 
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
     delay_1ms();
  }

void Key_init(void) //键盘初始化
{
 KEY_DDR &=~ (1<<S5)|(1<<S6)|(1<<S7)|(1<<S8);
 KEY_PORT |= (1<<S5)|(1<<S6)|(1<<S7)|(1<<S8);
}

void get_key(void) //按键检测
{
   switch(KEY_PIN&0xf0)
 {
   case 0xE0: {OCR0++;Beep();break;}
   case 0xD0: {OCR0++;Beep();break;}
   case 0xB0: {OCR0--;Beep();break;}
   case 0x70: {OCR0--;Beep();break;} //改变OCR0的值
   default: break;
 }
}

void Buzz_init(void) //蜂鸣器=初始化
{
 BUZZ_DDR |= (1<<SPK);
 BUZZ_PORT &=~ (1<<SPK);
}

void Beep(void) //蜂鸣器响
{
   BUZZ_PORT |= (1<<SPK);
   delay_nms(100);
   BUZZ_PORT &=~ (1<<SPK);
   delay_nms(50);
}

void timer0_init(void)
{
 TCCR0 = 0X00;
 OCR0 = 0XE7;     //8位的定时计数器的初值设定为0x55
 TCNT0 = 0;       //计数器
 TCCR0 = 0X19;    //设置为CTC模式,不采取分频
}

void port_init(void)
{

   DDRE = 0xFF;
   PORTE = 0xFF;
 
 PORTB |= BIT(PB4);           //比较匹配输出口打开
 DDRB  |= BIT(PB4);
}

void main(void)
{
 CLI();           //禁止所有中断
 
 timer0_init();
 port_init();
 Buzz_init();
 Key_init();
 
 TIMSK = 0X02;    //T0的比较溢出中断使能
 
 SEI();           //开启总中断
 
 while(1);        //等待比较匹配中断
}

#pragma interrupt_handler timer1_comA_isr:16    //定时器T0比较匹配中断服务程序
void timer1_comA_isr(void)
{
 get_key();
}

文章评论2条评论)

登录后参与讨论

zenghao616_997442595 2011-3-1 12:12

还不错。。。

用户306685 2011-3-1 11:39

这个不错哦 江西动漫网http://www.jxcomic.com/
相关推荐阅读
zenghao616_997442595 2012-02-01 14:44
超声波测距资料+程序
这里整理了超声波测距的资料和对应的源代码 附件是我的超声波模块的资料 资料.rar 编译器 ICC AVR 下面是源代码: #include #include #inc...
zenghao616_997442595 2012-01-12 18:42
电力系统潮流计算的计算机算法
电力系统潮流计算的计算机算法: 由于本人参加我们电气学院的电气小课堂,主讲的是计算机算法计算潮流这章,所以潜心玩了一个星期,下面整理给大家分享下。 本人一个星期以来的汗水,弄清楚了计算...
zenghao616_997442595 2011-09-15 18:56
05年电赛悬挂系统资料+控制
悬挂系统源代码.rar 走直线和走圆算法.rar     电赛培训的暑假 附件里面是画圆和画直线的算法 我自己做了05年电赛自动控制类型的题目  悬挂系统  画圆的那道题目 编译器 ICC AVR  ...
zenghao616_997442595 2011-09-15 18:44
TCS32OOD颜色传感器资料+程序
我用的是TCS32OOD型号的颜色传感器  附件里面有相关的资料附件里面还有 RGB对照表  附件里面还有我的颜色传感器的PCB和原理图 颜色传感器PCB.rar 资料.rar 编译器 ICC AVR...
zenghao616_997442595 2011-09-15 18:41
SCA100T角度传感器程序+资料
11年电赛我用的是 sca100t  型号的角度传感器 附件里面是资料和我的工程源文件 angle_sca.rar 读取角度传感器的数据需要进行转换才能得到相应的角度值 转换的公式在官方资料里面有 不...
zenghao616_997442595 2011-09-15 18:37
SPI协议AVR单片机双机通讯
相关寄存器说明以及资料请查阅官方资料文档 编译器 ICC AVRSPI双机通讯源文件 下面是从机接收主文件: #include<iom128v.h>#include<macros.h...
我要评论
2
7
关闭 站长推荐上一条 /2 下一条