#include "includes.h"
/*******************************************************************
*timer初始化
*初始化Timer1和Timer3 ,共输出6路PWM
*对应PWM输出引脚为pb.5,pb.6,pb.7 pe3,pe4,pe5
*******************************************************************/
void PWMinit(void)
{
DDRB|=(1<<PB5)|(1<<PB6)|(1<<PB7);
DDRE|=(1<<PE3)|(1<<PE4)|(1<<PE5);//设置pwm引脚方向
TCCR1A=0XA9;
TCCR1B=0X09;
TCCR3A=0XA9;
TCCR3B=0X09; //匹配清零, 8位pwm
setPWMduty(ALLPWMCHANNEL,0); //初始输出低电平
TIMSK=0X00; //t1溢出中断未使能
TIFR=0X00;
ETIMSK=0X00;
ETIFR=0X00;
}
/*******************************************************************
*PWM频率设置
*参数:PWM的记数最大值
*设置TCNTn寄存器,写入Timer的计数值
*******************************************************************/
void setPWMcycle(UINT16 PWMcycle)
{
UINT8 cSREG;
cSREG=SREG;
asm("cli");
TCNT1=PWMcycle;
TCNT3=PWMcycle;
asm("sei");
SREG=cSREG;
}
/*******************************************************************
*PWM占空比设置
*参数:PWM的比较值数组指针
*设置OCRnx寄存器,写入Timer的比较值
*******************************************************************/
void setPWMduty(UINT8 PWMchannel,UINT16 PWMduty)
{
UINT8 cSREG;
cSREG=SREG;
asm("cli");
switch(PWMchannel)
{
case 1: OCR1A=PWMduty;break;
case 2: OCR1B=PWMduty;break;
case 3: OCR1C=PWMduty;break;
case 4: OCR3A=PWMduty;break;
case 5: OCR3B=PWMduty;break;
case 6: OCR3C=PWMduty;break;
case ALLPWMCHANNEL:
OCR1A=PWMduty;
OCR1B=PWMduty;
OCR1C=PWMduty;
OCR3A=PWMduty;
OCR3B=PWMduty;
OCR3C=PWMduty;
break;
default:break;
}
asm("sei");
SREG=cSREG;
}
/*******************************************************************
*timer1中断产生PWM中断
*******************************************************************/
#pragma interrupt_handler Timer1ISR:15
void Timer1ISR(void)
{
unsigned char cSREG;
cSREG=SREG;
TIMSK=0X00;
asm("sei"); //允许中断嵌套
setPWMcycle(50);
setPWMduty(1,PWMdutyArry[1]);
delay(100);
asm("cli");
SREG=cSREG;
TIMSK=0X04;
}
/*******************************************************************
*timer3中断产生PWM中断
*******************************************************************/
#pragma interrupt_handler Timer3ISR:30
void Timer3ISR(void)
{
unsigned char cSREG;
cSREG=SREG;
ETIMSK=0X00;
asm("sei"); //允许中断嵌套
setPWMcycle(100);
setPWMduty(5,90);
setPWMduty(6,10);
delay(100);
asm("cli");
SREG=cSREG;
ETIMSK=0X00;
}
/*******************************************************************
*延时函数
*******************************************************************/
void delay(long i)
{
long j=260;
for (;i>0;i--)
{
for(;j>0;j--)
{}
j=260;
}
}
ROV.rar_Atmega128 pwm_MEGA64 6 pwm_atmega128_rov
版权申诉
146 浏览量
2022-09-22
21:19:56
上传
评论 1
收藏 36KB RAR 举报
小贝德罗
- 粉丝: 70
- 资源: 1万+