|
各位大侠,我写了一个用avr16单片机产生PWM波的程序,各位高人给看一下这个能启动我们刚到手的中特威电调吗?思路是用外部中断来改变占空比。
/********************************************/
/* 工作频率:内部8M *
* 输 出:PD4输出PWMB,PD5输出PWMA *
* 产生的PWMA,PWMB频率为8M/(1250*2*64)约50HZ,工作区间为10%占空比到22%占空比,
*步进为1.6%占空比,起始占空比为0.5%,起始到工作步进占空比为0.8%
********************************************/
#include <avr/io.h>
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include "avr/delay.h"
int m;
unsigned int a=6,b=6;
void port_init(void)
{
cli();
GIFR |=(1<< 6)|(1<<7);
MCUCR |=0x0a;
GICR |=(1<<6)|(1<<7);
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x0c;
DDRD = 0x30;
sei();
}
SIGNAL(SIG_INTERRUPT0)//增加占空比
{
cli();
if(a>=125)
{
m=20;a=m+a;b=b+m;
if(a>=275)
{
a=275;
b=275;
}
}
else
{
m=10;a=a+m;b=b+m;
}
OCR1A=a;
OCR1B=b;
GIFR |=(1<<6)|(1<<7);
sei();
}
SIGNAL(SIG_INTERRUPT1)//减少占空比
{
cli();
if(a<125)
{
;
}
else
{
m=20;a=a-m;b=b-m;
}
if(a<=125)
{
a=125;
b=125;
}
}
OCR1A=a;
OCR1B=b;
GIFR |=(1<<6)|(1<<7);
sei();
}
void timer1_init(void)
{
TCCR1A = 0xa2; //两路PWM,匹配清零
TCCR1B = 0x14; //相位修正PWM模式,预分频 64
ICR1 = 0x04e2; //计数上限为1250,11位PWM
}
void main(void)
{
port_init();
timer1_init();
OCR1A=a; //匹配初值
OCR1B=b;
while(1)
{
;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|