📄 interrupt.c
字号:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define a 0xf4 //a=0.95
#define b 0x0d //b=1-a=0.05
#define stopnum 1000
#define delay_time 10000
#define stop_speed 450
// (0~~255)
#define runspeed 100
//unsigned int c,d=0;
unsigned int howlong=0 ;
unsigned char num;
unsigned char x0,y0=0; //x0,ADCH的值;
unsigned char read_adc(unsigned char ad_chanel) //单通道AD值读取函数
{
ADMUX=1<<ADLAR|ad_chanel|1<<REFS1|1<<REFS0; //内参2.56V
ADCSRA=1<<ADEN|1<<ADSC|6<<ADPS0; //16分频做AD转换时钟
loop_until_bit_is_set(ADCSRA,ADIF); //等待ADCSRA中的ADIF位置位
ADCSRA=1<<ADIF;
return ADCH;
}
SIGNAL(SIG_OUTPUT_COMPARE0) //interrupt
{
x0=read_adc(0);
y0=(char)(((int)a*y0+(int)b*x0)>>8);
if(y0<5) {PORTB=0XFF;OCR1A=0;}
if(0<y0<1) {PORTB=0X7f;OCR1A=180;}
if((30<y0)&(y0<60)) {PORTB=0X3f;OCR1A=220;}
if((60<y0)&(y0<90)) {PORTB=0X1f;OCR1A=260;}
if((90<y0)&(y0<120)) {PORTB=0X0f;OCR1A=420;}
if((120<y0)&(y0<150)){PORTB=0X07;OCR1A=600;}
if((150<y0)&(y0<180)){PORTB=0X03;OCR1A=750;}
if((180<y0)&(y0<210)){PORTB=0X01;OCR1A=900;}
if((210<y0)&(y0<240)){PORTB=0X00;OCR1A=1020;}
}
void delay(unsigned int t)
{
for(;t;t--);
}
SIGNAL(SIG_INPUT_CAPTURE1)
{
TIMSK=00; //close capture interrupt
num=ICR1; //捕获计数器低8位的值
if(howlong>=100) //拿此值与runspeed比较,控制转速恒定
{ //可通过改变runspeed的值来使电机转速稳定到目标速度
if(num-runspeed>15)OCR1A+=5; //定速
if(runspeed-num>15)OCR1A-=5;
}
if(OCR1A>500)OCR1A=500;
if(OCR1A<200)OCR1A=200;
howlong++;
/* if(howlong==stopnum)
{ PORTB=0X01;
howlong=0;
OCR1A=0;
delay(65000);
PORTB&=0XFE;
OCR1A=500;
}*/
//if(TIFR&0X04)
ICR1=0;
TCNT1=0;
}
void main (void)
{
DDRB=0Xff; //PORTB is setting on out and PB4 input
DDRC=0XFF;
PORTC=0X00;
DDRD=0Xa0; //设置OC1A为输出
PORTB=0X7f;
TCCR1A=0x82; //OC1A(PD5) is "0",9 BITS PWM C3,10 bit PWM;c1,8 bit PWM
//0XC~ 初始电平为1;0X8~ 初始电平为0
TCCR1B=0X41; //上升捕获 ck/1
TCNT1=0; //初值
TIMSK=0X24; //open the capture interrupt捕捉中断开,T1溢出开
OCR1A=450; //占空比=OCR1A/1023
SREG=0X80; //enable total interrupt
// d=stop_speed;
//当PB4为高时,电机先刹车再短路停止,直到PB4为低;
//当PB4为低时,电机先加速后以最大速度匀速运动,直到PB4再次为高刹车停;
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -