⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myadc.c

📁 avr常用功能程序中包含了pwm、adc、中断、定时、i2c等各程序可供开发者直接使用
💻 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 + -