Зачем мне калибровать генератор при программировании AVR

Я новичок в программировании AVR. Я нашел образец кода в Интернете; для простой связи USART с ПК. Я немного сомневаюсь там.

Основной цикл начинается так;

void main(){
  OSCCAL_calibration(); 
  USARTinit();
  //start communicating with PC
}

Я не могу понять причину калибровки генератора, используя OSCCAL_calibration(); функция.


ФУНКЦИИ

OSCCAL_calibration()функция

void OSCCAL_calibration(void){
    unsigned char calibrate = 0;
    int temp;
    unsigned char tempL;
    CLKPR = (1<<CLKPCE);
    CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
    TIMSK2 = 0;
    ASSR = (1<<AS2);
    OCR2A = 200;
    TIMSK0 = 0;
    TCCR1B = (1<<CS10);
    TCCR2A = (1<<CS20);
    while((ASSR & 0x01) | (ASSR & 0x04));
    for(int i = 0; i < 10; i++)
    _delay_loop_2(30000);
    while(!calibrate){
        cli();
        TIFR1 = 0xFF;
        TIFR2 = 0xFF;
        TCNT1H = 0;
        TCNT1L = 0;
        TCNT2 = 0;
        while ( ! (TIFR2 && (1<<OCF2A)) );
        TCCR1B = 0; // stop timer1
        sei();
        if ( (TIFR1 && (1<<TOV1)) ){
            temp = 0xFFFF;
        }else{
            tempL = TCNT1L;
            temp = TCNT1H;
            temp = (temp << 8);
            temp += tempL;
        }
        if (temp > 6250){
            OSCCAL--;
        } else if (temp < 6120){
            OSCCAL++;
        }else
        calibrate = 1;
        TCCR1B = (1<<CS10);
    }
}

USARTinit()функция

void USARTinit(){
    CLKPR = (1<<CLKPCE);
    CLKPR = (1<<CLKPS1);
    UBRR0H = 0;
    UBRR0L = 12;
    UCSR0A = (1<<U2X0);
    UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
    UCSR0C = (0<<UMSEL00)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0);
}

я использую Atmel Studio 6 и проверил это с atmega2560 (на самом деле, с моей Arduino Mega). После небольшого количества изменений я мог заставить это работать. Но все равно работает без функции калибровки..

Я перечислю свои вопросы, как показано ниже.

  1. Что вы действительно делаете в качестве калибровки генератора?
  2. Это обязательно?
  3. Есть ли подобная функция в микроконтроллерах PIC? (Я немного опыт в программировании PIC. Но никогда не знал о чем-то подобном)

Также есть немного сомнений;

Почему вы устанавливаете часы предварительно скалярные в USARTinit() функционировать перед установкой скорости передачи? Вы не можете установить скорость передачи без предварительного скаляра (что означает, что предварительный скаляр = 1)

Это для экономии энергии или что-то? Но я попытался с pre-scalar=1, кажется, не работает (все еще пытается). Да, я правильно рассчитал скорость передачи данных (используя данное уравнение в техническом описании).

3 ответа

Решение

Если вы осуществляете какие-либо связи, связанные с синхронизацией, за пределами микроконтроллера (последовательный, увеличение spi до предела и т. Д.), Или отслеживание времени или чего-то еще, вам нужны более точные часы.

Дело не в мощности, возможно, в некоторой степени, если часы немного медленнее, то вы используете больше энергии, если немного быстрее, тогда вы экономите немного энергии.

Многие, но не все микроконтроллеры предлагают внутренний генератор R/C, так что вам не нужно иметь внешний генератор (дополнительные компоненты, дополнительные расходы). Это не одно семейство против другого (avr, msp430, рис и т. Д.). Некоторые чипы в семействе имеют внутренние генераторы, а некоторые нет. ПИК, который я использовал в тот день, требовал внешнего, не знаю семью в этой детали сегодня. То, как происходит калибровка, также зависит от семьи.

Я ничего не знаю об этом конкретном оборудовании, но быстрый Google показал эту таблицу

Цитировать:

Большинство современных микроконтроллеров AVR предлагают возможность запуска от внутреннего RC-генератора. Внутренняя частота генератора RC может быть откалибрована в большинстве AVR с точностью +/-1% от частоты, указанной в техническом описании устройства. Эта функция предлагает большую гибкость и значительную экономию средств по сравнению с использованием внешнего генератора. Калибровка, выполняемая на заводе Atmel, производится при фиксированном рабочем напряжении и температуре (25°C, обычно 5 В). Поскольку на частоту внутреннего RC-генератора влияют как рабочее напряжение, так и температура, может потребоваться выполнить вторичную калибровку, которая соответствует конкретной среде применения. Эта вторичная калибровка может быть выполнена, чтобы получить более высокую точность, чем стандартная калибровка, чтобы соответствовать определенному рабочему напряжению или температуре, или даже настроить генератор на другую частоту.

Необходимость калибровки зависит от вашего фактического оборудования:

  1. Если ваш микроконтроллер использует Xtal для генерации своих часов, вам не нужно ничего калибровать, выберите только хороший делитель, в зависимости от частоты колебаний вашего Xtal.

  2. Если вы используете только RC-генератор, то, поскольку он может иметь более важный допуск значения, вы можете откалибровать частоту, особенно при использовании более высоких скоростей передачи (например, 19200 или более).

Существует предварительный скалер, который вы должны установить в зависимости от частоты вашего генератора, см. Таблицу данных для более подробной информации.

Другие вопросы по тегам