//Atmega64, 通过OC2输出可变PWM波。给你参考下
//启动PWM,电磁铁通电,
void pwm_on()
{
TIMSK&=~(1<<OCF2); //禁止T2比较匹配功能,此处是为了防止在设置T2比较匹配功能时引发中断
TCNT2=0;
OCR2=OCR2_START; //设置初始占空比
TIFR|=1<<OCF2; //向T2匹配中断标志写1,清中断标志位
TIMSK|=1<<OCIE2; //T2比较匹配中断使能
TCCR2=(1<<WGM20)|(1<<COM21)|(1<<CS20); //相位修正的PWM模式,上升比较配时清零,无分频
}
//关闭电磁铁
void pwm_off()
{
TIMSK&=~(1<<OCIE2); //禁止T2比较匹配中断
TCCR2&=~((1<<CS22)|(1<<CS21)|(1<<CS20)); //关闭T2时钟
PORTB&=~(1<<PORTB7); //PB7置0,电磁铁断电
}
//T2比较匹配中断处理函数,设计为占空比达到最大时刚好压紧弹**,然后立即松开
ISR(TIMER2_COMP_vect) //T2比较匹配中断服务程序,产生PWM脉冲波,
{
if(counter_t2>counter_t2_lasts) //counter_t2_lasts每种脉宽的方波持续的脉冲数
{
counter_t2=0;
OCR2++;
}
else
{
counter_t2++;
}
if(OCR2>OCR2_STOP) //占空比达到最大后,关闭PWM波,
{
counter_t2=0; //停止PWM波,计数完成,清零
pwm_off(); //电磁铁断电
}
}
|