没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
ATMEGA128 PWM 输出系列例程
1、定时器 0,快速PWM模式
快速 PWM 可以的到比较高频率的 PWM 输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,计数器的上限值决定 PWM 的频率,
而比较匹配寄存器的值决定了占空比的大小。PWM 频率的计算公式为:
PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))
快速 PWM 模式适合要求输出 PWM 频率较高,但频率固定,占空比调节精度要求不高的应用。
/*定时器 0,快速 PWM 模式,由 OC0 输出 PWM 波 */
/*PWM 频率 = 系统时钟频率/(分频系数*(1+计数器上限值))*/
/*本程序中:频率=8000000/(8*(1+255))=3.91KHZ,频率固定 */
/*占空比为:OCR0/0XFF=OCR0/256,占空比可调 */
/*TCNT0 从 BOTTOM 计数到 MAX,然后回到 BOTTOM 重新开
始;TCNT0 计数到与 OCR0 相等时,
OC0 清零,在 BOTTOM 时置位 1 */
#include <iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
volatile uchar num;
void pwm0_init(void)
{
DDRB=0X10; //将 PB4 设置为输出
TCCR0=0X00; //关闭
num=64; //设置输出比较寄存器的初值
TCNT0=0; //计数器初值为 0
TCCR0=0X6A; //设置为快速 pwm 模式,采取 8 分频
}
/*键盘初始化 */
void init_key()
{
DDRD=0X00;
PORTD=0XFF;
}
/*延时函数 */
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1140;y>0;y--);
}
/*键盘扫描 */
void keyscan(void )
{
if((PIND&0x01)==0)
{
while(!(PIND&0x01)); //松手检测
delay_ms(50);
num+=5;
if(num==255)
num=0;
}
if((PIND&0x02)==0)
{
while(!(PIND&0x02));
delay_ms(50);
num-=5;
if(num==0)
num=255;
}
if((PIND&0x08)==0)
{
while(!(PIND&0x01));
delay_ms(50);
num=128;
}
}
void main(void)
{
uchar wide;
pwm0_init();
init_key();
while(1)
{
OCR0=num;
keyscan();
}
}
2、定时器 0,相位修正(调整)模式
频率(相位)调整 PWM 模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。同样计数器的上限值决定了 PWM 的频率,
比较匹配寄存器的值决定了占空比的大小。PWM 频率的计算公式为:
PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
相位调整 PWM 模式适合要求输出 PWM 频率较低,但频率固定,占空比调节精度要求高的应用。当调整占空比时,PWM 的相位也相应的跟着变化。
/*定时器 0,相位调整 PWM 模式,由 OC0 输出 PWM 波 */
/*PWM 频率 = 系统时钟频率/(分频系数*(1+2*计数器上限值)) */
/*本程序中:频率=8000000/(8*(1+2*255))=1.96KHZ,频率固定 */
/*占空比为:OCR0/0XFF=OCR0/256,占空比可调 */
/*TCNT0 从 BOTTOM 递增计数到 MAX,然后递减计数回到 BOTTOM,再从
BOTTOM 重新开始,以此往复;TCNT0 增计数到
与 OCR0 相等时,OC0 清零;TCNT0 减计数到 OCR0 时,OC0 置 1 */
#include <iom128v.h>
#include<macros.h>
#define uint unsigned int
#define uchar unsigned char
volatile uchar num;
void pwm0_init(void)
{
DDRB=0X10; //将PB4 设置为输出,即OC0
TCCR0=0X00; //关闭
num=64; //设置输出比较寄存器的初值
TCNT0=0; //计数器初值为 0
TCCR0=0X62; //设置为相位调整PWM模式,8 分频
}
/*键盘初始化 */
void init_key()
{
DDRD=0X00;
PORTD=0XFF;
}
/*延时函数 */
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1140;y>0;y--);
}
剩余10页未读,继续阅读
tldf521125
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论29