Разные значения от АЦП между кодом BASCOM и C? - PullRequest
0 голосов
/ 24 января 2019

Я работаю над новой версией программного обеспечения для одной из наших плат с процессором Atmel AT90CAN128.

Старая версия программного обеспечения была написана на BASCOM (не мной).Чтобы нормализовать наше программное обеспечение, мы перевели программное обеспечение на C-код.

Теперь у меня проблема с получением правильных значений АЦП.Я думаю, что это проблема программного обеспечения, потому что значения АЦП отличаются, когда я использую BASCOM и программу C на одной плате.

Например:

Я использую потенциометр для изменения напряжения.Если потенциал находится в том же положении, программа 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;
}
...