Я хотел бы увеличить разрешение PWM бит Arduino Uno. На данный момент это 8 бит, который я считаю слишком низким. Возможно ли это без потери способности прерываний и задержек?
Koen
РЕДАКТИРОВАТЬ Эта установка обеспечивает 16-битное разрешение
void setupPWM16() {
DDRB |= _BV(PB1) | _BV(PB2); /* set pins as outputs */
TCCR1A = _BV(COM1A1) | _BV(COM1B1) /* non-inverting PWM */
| _BV(WGM11); /* mode 14: fast PWM, TOP=ICR1 */
TCCR1B = _BV(WGM13) | _BV(WGM12)
| _BV(CS11); /* prescaler: clock / 8 */
ICR1 = 0xffff; /* TOP counter value (freeing OCR1A*/
}
/* Comments about the setup
Changing ICR1 will effect the amount of bits of resolution.
ICR1 = 0xffff; (65535) 16-bit resolution
ICR1 = 0x7FFF; (32767) 15-bit resolution
ICR1 = 0x3FFF; (16383) 14-bit resolution etc....
Changing the prescaler will effect the frequency of the PWM signal.
Frequency[Hz}=CPU/(ICR1+1) where in this case CPU=16 MHz
16-bit PWM will be>>> (16000000/8)/(65535+1)=30.5175Hz
*/
/* 16-bit version of analogWrite(). Works only on pins 9 and 10. */
void analogWrite16(uint8_t pin, uint16_t val)
{
switch (pin) {
case 9: OCR1A = val; break;
case 10: OCR1B = val; break;
}
}
источник
ICR1
на0x1fff
, тогда ваша частота будет 1953 Гц (F_CPU / (TOP + 1)) с прескалером на 1.ICR1 = 0x03FF
и в 0 я вижу крошечный пульс на прицеле, достаточный, чтобы зажечь светодиод. Любые идеи?analogWrite16(pin, val)
дает рабочий цикл (val + 1) / ICR1. Как обходной путь, ArduinoanalogWrite()
делаетif (val == 0) digitalWrite(pin, LOW); else if (val == 255) digitalWrite(pin, HIGH);
. Но тогда вы не можете получить рабочий цикл 1 / ICR1 ...С помощью некоторой калибровки вы можете суммировать выходы двух каналов ШИМ с различными весовыми резисторами. В крайнем случае вы можете условно использовать один выход для обеспечения 8-битного разрешения, а другой масштабировать до 1/255-го уровня и добавлять их так, чтобы 2-й канал покрывал один бит диапазона, и вы (опять же условно) получили 16-битное разрешение. Без огромной заботы и настройки все, что вы получите, будет беспорядок.
Однако, разделив 2-й канал на 16 или 32, вы можете добавить несколько дополнительных битов PWM-разрешения. Просто добавив 2 канала ШИМ аналоговых фильтрованных выходов, вы добавляете дополнительный бит (так как потенциальный диапазон удваивается для неизменных мВ / бит).
Условно (опять же) для каждого дополнительного деления на 2 вы получаете дополнительный бит разрешения, но это может быть выполнено только для, возможно, 4, 5 или 6 дополнительных битов, с повышающимися требованиями к точности масштабирующих резисторов и более сложной калибровкой и склонностью к ошибкам. ,
Краткий пример.
Если один ШИМ уменьшится до 0 - 255 мВ с шагом 1 мВ, то суммирование двух ШИМ с одинаковой амплитудой даст диапазон 0 - 510 мВ с шагом 1 мВ.
Если один ШИМ уменьшен в 32 раза, то вместо добавления 255 мВ к начальному диапазону ШИМ, он добавит только 8 мВ к верхнему пределу (0,256,32 = 8 мВ, но разрешение будет в 0,03125 (1/32). ) мВ шаги.
Хотя это может быть достигнуто исключительно с помощью суммирования резисторов и RC-фильтрации, использование летнего ОУ значительно улучшит результаты.
Кроме того, пульсация ШИМ может быть отфильтрована с помощью простого RC-фильтра, но использование одного операционного усилителя в качестве буфера (или даже только одного транзистора в качестве повторителя эмиттера) даст вам 3 или 5 полюсов фильтрации нижних частот и намного больше шансов на получение дополнительного ШИМ разрешающая способность. Я не проверял «фазовую когерентность» выходов ШИМ, но ожидаю, что они движутся в относительном слое, так что вы не получите преимущества сглаживания при добавлении двух некоррелированных сигналов.
Дополнительные комментарии могут быть сделаны в случае необходимости. Спросите, если интересно.
источник