ATtiny85 PWM более низкая частота, чем ожидалось

Я новичок в программировании микроконтроллеров и пытаюсь использовать ШИМ на ATtiny85. Я просмотрел в Интернете различные учебные пособия и мне удалось заставить его работать с приведенным ниже кодом. Моя проблема в том, что я ожидаю, что частота ШИМ будет 8 МГц / 256 = 31,25 кГц, но на самом деле это 3,9 кГц, что предполагает использование значения 8 для предварительного масштабирования. Я просмотрел таблицу, но все еще не могу понять.

#define F_CPU 8000000
#include <avr/io.h>

int main(void)
{
  //Table 11-3 Compare Output Mode, Fast PWM mode
  //Table 11-5 Waveform Generation Mode Bit Description
  //COM0A0 - non-inverting
  TCCR0A |= (0<<WGM02)|(1<<WGM01)|(1<<WGM00)|(1<<COM0A1);
  //Table 11-6 Clock Select Bit Description
  TCCR0B |= (0<<CS02)|(0<<CS01)|(1<<CS00); //pre-scale factor = 1

  OCR0A=128; // 128/256 = 0.5 duty cycle

  //make PWM pin output
  DDRB |= (1<<DDB0);

  while(1){}

  return 0;
}

Я программирую MCU, используя Raspberry Pi с avrdude и avr-gcc в соответствии с этой инструкцией: http://www.instructables.com/id/Programming-the-ATtiny85-from-Raspberry-Pi/

Любая помощь или предложения будут приняты с благодарностью. Спасибо :)


person spacenut1    schedule 23.02.2018    source источник
comment
Строка TCCR0B |= (0<<CS02)|(0<<CS01)|(1<<CS00); //pre-scale factor = 1 не делает то, что вы думаете. Он устанавливает бит CS00, но абсолютно не влияет на биты CS01 и CS02: вы вводите эти значения в регистр (|=) с помощью операции ИЛИ, который может изменять только 0 на 1, а не наоборот.   -  person jasonharper    schedule 23.02.2018
comment
@jasonharper Спасибо, что указали на это. Я понимаю, о чем вы говорите, но не понимаю, почему это может вызвать мою проблему, поскольку биты CS01 и CS02 по умолчанию должны быть нулевыми.   -  person spacenut1    schedule 23.02.2018


Ответы (1)


Я обнаружил, что по умолчанию предохранители на ATtiny85 настроены на деление тактовой частоты 8 МГц на 8, что объясняет очевидный коэффициент предварительного масштабирования 8, с которым я столкнулся. Я заменил предохранители в соответствии с этим калькулятором предохранителей, и он отлично сработал. Странно, что ни в одном из руководств, которые я прочитал, об этом не упоминалось, но, надеюсь, мои усилия помогут кому-то еще, у кого такая же проблема.

person spacenut1    schedule 24.02.2018