Arduino PWM 1 кГц и 10-битное разрешение

pwm

Как следует из названия, мне нужен сигнал частотой 1 кГц с 10-битным разрешением. Но я плохо разбираюсь в uController и сложном программировании.

Мне нужен простой код для этой задачи.

Я пытался использовать этот интерактивный ШИМ с arduinoslovakia.eu, но я не знаю, что такое частота при 10-битном разрешении и как установить частоту в этом коде.

, 👍0

Обсуждение

Вы про прямоугольную волну? Каким образом он будет иметь 10-битное разрешение? Либо это 1 кГц, либо нет, да? Вы говорите о факторе ошибки? Например, 1 кГц +/- 5%?, @Nick Gammon

@NickGammon «10-битное разрешение» будет относиться к разрешению параметра рабочего цикла. т. е. рабочий цикл от 0 до 1023 вместо нормального от 0 до 255., @Majenko

Возможно, но в довольно кратком вопросе не упоминаются рабочие циклы., @Nick Gammon

@NickGammon Нет, но он *упоминает* ШИМ, а ШИМ имеет рабочий цикл (что и делает его ШИМ)., @Majenko


1 ответ


Лучший ответ:

2

Я вижу, вы говорите об использовании 16-битного таймера, который в Uno является Таймером 1.

Предполагая, что вы используете Uno, этот код сделает это:

// Желаемая тактовая частота, деленная на 1 кГц
const long timer1_OCR1A_Setting = F_CPU / 1000;

const byte outputPin = 10;  // Выход таймера 1 "B": OC1B

void setup() 
 {
  pinMode (outputPin, OUTPUT);

  // устанавливаем Таймер 1
  // Вершина быстрой ШИМ на уровне OCR1A
  TCCR1A = bit (WGM10) | bit (WGM11) | bit (COM1B1); // быстрый ШИМ, сброс OC1B при сравнении
  TCCR1B = bit (WGM12) | bit (WGM13) | bit (CS10);   // быстрая ШИМ, без предделителя
  OCR1A =  timer1_OCR1A_Setting - 1;                 // относительный нуль
  OCR1B =  (timer1_OCR1A_Setting / 2) - 1;           // 50 % рабочий цикл
  }  // конец настройки

void loop()
  {
  }

Вы можете изменить 1000 в расчете для timer1_OCR1A_Setting, в разумных пределах, чтобы получить другие частоты.

Дополнительную информацию см. на моей странице о таймерах.

,

На Arduino 16 МГц вы получите около 14 бит разрешения, используя этот код. Однако невозможно получить именно 14-битное (или 10-битное) разрешение без изменения частоты (примерно до 0,9765 кГц)., @Gerben

Чтобы объяснить этот комментарий, OCR1A будет установлен на 16000, используя приведенный выше код, а это log(16000)/log(2) бит, а именно примерно 13,97 бит. Поэтому ваш рабочий цикл (OCR1B) может находиться в диапазоне от 0 до 15999, что дает разрешение не менее 10 бит., @Nick Gammon

Спасибо за ответ., @Vikas Kumar