2016-05-31 3 views
0

Я хочу использовать Arduino Due PWM с более высоким разрешением и частотой, чем по умолчанию. Я использую IDE 1.6.8, который был последним несколько недель назад, когда я его установил (я думаю, 1.6.9 может быть на пути). После поиска в Интернете и экспериментировать с доской и осциллографом, я получил следующие выводы:Arduino Due PWM

  • Чтобы получить более высокие частоты ШИМ, один должен изменить соответствующие строки в variant.h. PWM, по-видимому, влияет на контакты 6, включенные в 9 включенных, TC - другие штыри, поддерживаемые PWM; Я думаю, это из-за того, какой контакт находится на таймере? Кажется, Micros(), Миллис() и т.д., не пострадали от модификации:

#define PWM_FREQUENCY 20000 // changed from 1000 #define TC_FREQUENCY 20000 // changed from 1000

  • Как сказано в нескольких местах, то analogWriteResolution() функция Arduino сломана , или, по крайней мере, он сам по себе недостаточен для того, чтобы увеличить разрешение на ПРМ. Для analogWriteResolution() работать, как и ожидалось, один также необходимо изменить следующее variant.h:

#define PWM_MAX_DUTY_CYCLE 4095 // changed from 255 #define PWM_MIN_DUTY_CYCLE 0 #define PWM_RESOLUTION 12 // changed from 8

  • кажется, что физическая маркировка на Arduino Due R3 -Е это стандарт, когда я купил свою доску в заблуждение: она написана на доске ЦИФРОВОЙ (PWM ~) и такой ~ присутствует только на контактах 3, 5, 6, 9, 10, 11, Я могу получить PWM на всех штырях 2, включенных в 13 включен.

Я размещаю этот контент здесь, так как мне потребовалось некоторое время, чтобы выяснить все, и проверить осциллограф и т. Д., И я не смог найти ответы на stackoverflow. У меня также есть два вопроса:

  • Это нормально (как это выглядит, как из тестов, которые я сделал), чтобы изменить ШИМ и частоты ТС? Может ли он взаимодействовать с другими основными функциями/библиотеками?

  • Есть ли причина для значений по умолчанию максимального рабочего цикла PWM и разрешения, кроме обратной совместимости?

ответ

1

Вы можете сделать это с частотой ШИМ делителей:

Это реализуется в библиотеке PWMfrequency: http://playground.arduino.cc/Code/PwmFrequency , который в основном выглядит следующим образом:

void setPwmFrequency(int pin, int divisor) { 
    byte mode; 
    if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { 
    switch(divisor) { 
     case 1: mode = 0x01; break; 
     case 8: mode = 0x02; break; 
     case 64: mode = 0x03; break; 
     case 256: mode = 0x04; break; 
     case 1024: mode = 0x05; break; 
     default: return; 
    } 
    if(pin == 5 || pin == 6) { 
     TCCR0B = TCCR0B & 0b11111000 | mode; 
    } else { 
     TCCR1B = TCCR1B & 0b11111000 | mode; 
    } 
    } else if(pin == 3 || pin == 11) { 
    switch(divisor) { 
     case 1: mode = 0x01; break; 
     case 8: mode = 0x02; break; 
     case 32: mode = 0x03; break; 
     case 64: mode = 0x04; break; 
     case 128: mode = 0x05; break; 
     case 256: mode = 0x06; break; 
     case 1024: mode = 0x07; break; 
     default: return; 
    } 
    TCCR2B = TCCR2B & 0b11111000 | mode; 
    } 
} 
Смежные вопросы