C 如何在Atmega 1281中使用AD转换

C 如何在Atmega 1281中使用AD转换,c,C,嗨,伙计们,我一直在尝试将ADC作为我的Atmega1281控制器的输入引脚,但没有成功 我只想用电位计控制一个微伺服 这是我的代码,请帮助我,它不会在我的控制器上工作 #define F_CPU 16000000 //16MHz #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> //#include <std

嗨,伙计们,我一直在尝试将ADC作为我的Atmega1281控制器的输入引脚,但没有成功

我只想用电位计控制一个微伺服

这是我的代码,请帮助我,它不会在我的控制器上工作

#define F_CPU 16000000 //16MHz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>

//#include <stdio.h>
//#include "uart/uart.h"


#define PWM_PRESCALLER 64
#define ICR_MAX (long double)F_CPU/PWM_PRESCALLER/50
#define OCR_MIN ICR_MAX/20
#define OCR_MAX ICR_MAX/10

//char uart_s[150];
volatile unsigned long adc_val=0;
volatile unsigned long counter=0;
unsigned long curr_adc=0;

ISR (ADC_vect)
{
    adc_val += ADC;
    counter++;
}

int main(void)
{
    //uart_init(uart_calc_ubrr(F_CPU));

    DDRB |= (1<<DDB1);

    ICR1 = ICR_MAX;
    OCR1A = OCR_MIN;
    TCCR1A = (1 << COM1A1) | (1<<WGM11);
    TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11) | (1<<CS10);



    ADMUX = (1 << REFS0);
    ADCSRA = (1 << ADEN)|(1 << ADFR)|(1 << ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

    sei();

    ADCSRA |= (1<<ADSC);



    while(1)
    {
        if(counter >= 500)
        {
            cli();

            unsigned long round_val = round(adc_val / counter);

            adc_val=0;
            counter=0;

            if(abs(round_val - curr_adc) > 1)
            {
                curr_adc = round_val;
            }

            long double ocr = OCR_MIN + ((long double)curr_adc * (OCR_MAX - OCR_MIN)/1024);

            /*sprintf(uart_s, "ADC = %8lu, OCR = %f, rounded = %d\r\n", curr_adc, ocr, (int)round(ocr));
            uart_send_string((unsigned char*) uart_s);*/

            OCR1A = (int)round(ocr);

            //_delay_ms(100);
            sei();
        }
    }
}
#定义F#u CPU 16000000//16MHz
#包括
#包括
#包括
#包括
//#包括
//#包括“uart/uart.h”
#定义PWM_预调谐器64
#定义ICR_最大值(长双精度)F_CPU/PWM_预调谐器/50
#定义OCR_最小值ICR_最大值/20
#定义OCR\u最大值ICR\u最大值/10
//char uart_s[150];
易失性无符号长adc_val=0;
易失性无符号长计数器=0;
无符号长电流adc=0;
行业特殊风险(ADC_vect)
{
adc_val+=adc;
计数器++;
}
内部主(空)
{
//uart_init(uart_calc_ubrr(F_CPU));

DDRB |=(1它在我的控制器上也不起作用。但我不会告诉你我遇到了什么错误。也许你会告诉我们你的错误?我不gt任何错误,但ADCSRA=(1它在我的控制器上也不起作用。但我不会告诉你我遇到了什么错误。也许你会告诉我们你的错误?我不gt任何错误,但ADCSRA=(1)