C 如何在Atmega 1281中使用AD转换
嗨,伙计们,我一直在尝试将ADC作为我的Atmega1281控制器的输入引脚,但没有成功 我只想用电位计控制一个微伺服 这是我的代码,请帮助我,它不会在我的控制器上工作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
#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)