我正在为我们的一个带有 Atmel AT90CAN128 处理器的电路板开发新的软件版本。
较旧的软件版本是用 BASCOM 编写的(不是我写的)。为了规范我们的软件,我们将软件翻译成 C 代码。
现在我很难获得正确的 ADC 值。我认为这是一个软件问题,因为当我在同一块板上使用 BASCOM 和 C 程序时,ADC 的值不同。
例如:
我用一个电位器来改变电压。如果电位处于相同位置,BASCOM 程序给我的值是 460,而 C 程序只给我 320。
也许我没有正确翻译 BASCOM 程序的一部分。
我附上了旧 BASCOM 的代码和新的 C 代码。
文件开头的BASCOM中的代码:
Config Adc = Single , Prescaler = 64 , Reference = Avcc 'ADC-Clock 8000000/64 = 125 kHz bei 8 MHz
' Later function
Function Adc_abfragen() As Word
Local Channel As Byte
'Admux = &B 01 0 11011 ' ADMUX: 01 =reference = avcc, 0 = right adjust 11011 = adc3 = plus, adc2 = Gnd
Channel = 3
Start Adc
Adc_abfragen = Getadc(channel , 88) ' 88 addieren zu channel 3 = admux = &B01011011
Stop Adc
End Function
C 代码(函数 init_ADC 在主函数开头调用
void init_ADC(void)
{
ADCSRA |= (1<<ADEN); // enable ADC
// Prescaler to 64
// 8 MHz / 64 => 125kHz
ADCSRA &= ~(1<<ADPS0);
ADCSRA |= (1<<ADPS1);
ADCSRA |= (1<<ADPS2);
ADMUX &= ~(1<<REFS1); // AVCC
ADMUX |= (1<<REFS0);
ADMUX &= ~(1<<ADLAR); // right align
// MUX4-0 adc3 = plus, adc2 = Gnd
ADMUX |= (1<<MUX4);
ADMUX |= (1<<MUX3);
ADMUX &= ~(1<<MUX2);
ADMUX |= (1<<MUX1);
ADMUX |= (1<<MUX0);
// read first value
ADCSRA |= (1<<ADSC); // Start ADC conversion
while(ADCSRA &(1<<ADSC)); // Wait for conversion
}
// Function is called later in the main loop
uint16_t ADC_ReadValue (void)
{
ADCSRA |= (1<<ADSC); // Start ADC conversion
while(ADCSRA &(1<<ADSC));// Wait for conversion
return ADC;
}