📄 myadc.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 runspeed 100
unsigned int howlong=0;
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_INPUT_CAPTURE1)
{
unsigned char num=0;
/* 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==3000){howlong=0;OCR1A==0;PORTB=0XFF;
delay(65000);delay(65000);
delay(65000);delay(65000);
delay(65000);delay(65000);}
x0=read_adc(0);
if(y0<5) {PORTB=0XFF;OCR1A=0;}
if((5<y0)&(y0<15)) {PORTB=0X7f;OCR1A=120;}
if((15<y0)&(y0<30)) {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;}
ICR1=0;
TCNT1=0;
}
}
/*SIGNAL(SIG_OUTPUT_COMPARE0) //interrupt
{
//y0=(char)(((int)a*y0+(int)b*x0)>>8);
y0=x0;
//PORTB=y0;
x0=read_adc(0);
if(y0<5) {PORTB=0XFF;OCR1A=0;}
if((5<y0)&(y0<15)) {PORTB=0X7f;OCR1A=120;}
if((15<y0)&(y0<30)) {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;}
}*/
int main(void)
{
DDRA=0X00;
DDRB=0XFF; //OCR0,T0比较输出;在比较中断中改变PB口
DDRD=0X20; //设置OC1A为输出
TCCR1A=0x83; //OC1A(PD5) is "0",10 BITS PWM
TCCR1B=0X41; //CLK/1,上升沿
//OCR0=0X0f; //设置OCR0的值(此值越大,采频越低),使采样频率约为500Hz
TCCR0=1<<WGM01|3<<CS00;
TIMSK=1<<OCIE0|5<<TICIE1;
//TIMSK=0X24; //open the capture interrupt捕捉中断开,T1溢出开
TIFR=1<<OCF0;
TCNT1=0; //初值
SREG=0X80;
// howlong=3000;
OCR1A=800;
while(1){;}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -