Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.03.2014, 15:05
|
|
Администратор
Регистрация: 10.05.2003
Сообщений: 1,739
Сказал спасибо: 497
Сказали Спасибо 2,686 раз(а) в 595 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Народ, зачем ругаться)) На куче форумов задавался этот вопрос, значит начинающие сталкиваются с подобным ограничением. Не виноваты же они, что что ардуина не учит программера работе с таймерами и PWM.
Я и сам вот затупил с этим ШИМ'ом ардуиновским (ихняя analogWrite - зло, начинающему будет сложно понять, в чем там дело), редко с ним имею дело, но для разработки готовых кирпичиков иногда удобно, и понятия не имел что ихний штатный ШИМ работает на такой низкой частоте, а потом просто поменял делитель. Писалось бы под "голый" контроллер без встроенных функция, сразу было бы понятно, что надо настроить делители. Если эта инфа кому поможет - буду рад)
|
|
|
Сказали "Спасибо" mikesmith
|
|
|
29.03.2014, 18:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Сообщение от mikesmith
|
встроенная функция analogWrite - организует на ножке широтноимпульсную модуляцию с частотой около 480-490Гц (при штатных 16Мгц)
|
Как же им это "удалось", это надо постараться!
Судя по ДШ
При тактовой 16 МГц и прескалере таймера=1, можно иметь аппаратный ШИМ:
16000/256=62,5 кГц
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
29.03.2014, 19:42
|
|
Администратор
Регистрация: 10.05.2003
Сообщений: 1,739
Сказал спасибо: 497
Сказали Спасибо 2,686 раз(а) в 595 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Вот они и поделили на 64/256 (в зависимости от ноги) и ничиго никому не сказали)) Мол, для управления сервомоторчиком или светодиодом "пофэйдить" - хватит. А если светодиодов несколько и индикация динамическая - покупайте ихние платки с аппаратными RGB-дровами и ни слова о делителях (это я о начинающих) %)
|
|
|
|
29.03.2014, 20:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
mikesmith, посмотрите, если niXto говорит что можно вставлять ассемблерные вставки, то измените прескалер таймера, к примеру для таймера 0:
Код:
|
ldi r16,(1‹‹CS00) ;предделитель таймера ставим=1
out TCCR0B,r16 ;записываем в регистр |
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
Сказали "Спасибо" gary2007
|
|
|
29.03.2014, 20:53
|
|
Администратор
Регистрация: 10.05.2003
Сообщений: 1,739
Сказал спасибо: 497
Сказали Спасибо 2,686 раз(а) в 595 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Да уже изменил))
Код:
|
TCCR1B = TCCR1B & 0b11111000 | 0x01;
TCCR2B = TCCR2B & 0b11111000 | 0x01; |
Но можно и ассемблерной вставкой, конечно
|
|
|
|
22.12.2015, 21:58
|
|
Частый гость
Регистрация: 22.12.2015
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Добрый день!
Чтобы не заводить новую тему, спрошу здесь.
Мега2560
Нужен ШИМ для 6 светодиодов, так чтобы не видно было мерцаний, 490ГЦ не подходит.
Пишу в сетапе
TCCR0B = TCCR0B & 0b11111000 | 0x02;
TCCR1B = TCCR1B & 0b11111000 | 0x02;
TCCR2B = TCCR2B & 0b11111000 | 0x02;
Вывожу на диоды
analogWrite(led_3, light); и т.д. на все ноги
- на 9,10,11 ногах все гуд, на 3,5,6 как было так и остается низкая частота.
Видимо какие-то конфликты с таймерами идут.
Я понимаю что надо читать даташиты, но в двух словах, это можно как-то поправить?
Спасибо.
|
|
|
|
22.12.2015, 22:40
|
|
Администратор
Регистрация: 10.05.2003
Сообщений: 1,739
Сказал спасибо: 497
Сказали Спасибо 2,686 раз(а) в 595 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
1) Arduino 2560 имеет 12 пинов, поддерживающих ШИМ. Номера пинов от 2 до 13.
2) Частота ШИМ по умолчанию 490 Гц для всех выводов, за исключением 13 и 4, частота на которых составляет 980 Гц.
3) Таймеров несколько, все управляют разными выводами:
Таймер 0 (PWM пинов 13 и 4);
таймер 1 (PWM пинов 12 и 11);
Таймер 2 (PWM пинов 10 и 9);
Таймер 3 (PWM пинов 5, 3 и 2);
Таймер 4 (PWM пинов 8, 7 и 6);
4) Частоты ШИМ в зависимости от делителя (для TCCR1B, TCCR2B, TCCR3B, TCCR4B):
делитель = 1 ---› частота ШИМ 31000 Гц
делитель = 2 ---› частота ШИМ 4000 Гц
делитель = 3 ---› частота ШИМ 490 Гц (значение по умолчанию)
делитель = 4 ---› частота ШИМ 120 Гц
делитель = 5 ---› частота ШИМ 30 Гц
делитель = 6 ---› частота ШИМ ‹20 Гц
для TCCR0B (Таймер 0):
делитель = 1 ---› частота ШИМ 62000 Гц
делитель = 2 ---› частота ШИМ 7800 Гц
делитель = 3 ---› частота ШИМ 980 Гц (значение по умолчанию)
делитель = 4 ---› частота ШИМ 250 Гц
делитель = 5 ---› частота ШИМ 60 Гц
делитель = 6 ---› частота ШИМ ‹20 Гц
P.S. Обратите внимание, что на TCCR0B (Таймер 0) завязаны все основные функции времени в Arduino: то есть, если вы измените этот таймер, такие функции как Delay(), Millis() и т.п. будет продолжать работать, но в другом масштабе времени (быстрее или медленнее)
|
|
|
|
22.12.2015, 22:42
|
|
Администратор
Регистрация: 10.05.2003
Сообщений: 1,739
Сказал спасибо: 497
Сказали Спасибо 2,686 раз(а) в 595 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Так как вы просили "в двух словах", в вашем случае вы забыли про третий и четвертый таймеры:
TCCR3B = TCCR3B & 0b11111000 | 0x02;
TCCR4B = TCCR4B & 0b11111000 | 0x02;
Ну и помните про TCCR0B, если собираетесь работать с функциями задержек, пересчитайте их.
|
|
|
|
22.12.2015, 23:16
|
|
Частый гость
Регистрация: 22.12.2015
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Спасибо большое, то что надо. Видимо я на другой контроллер инфу посмотрел. Спасибо, все работает!
|
|
|
|
07.03.2017, 15:27
|
|
Прохожий
Регистрация: 07.03.2017
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Увеличить частоту ШИМ'а Arduino
Я только начинающий, но что то тут не сходится.
Мы говорим тут о ТCCR0/TCCR1/TCCR2
ТCCR0 и TCCR2 - 8 битные таймеры/счетчики.
TCCR1 - 16 битный таймер счетчик.
Итак по Вашей технологии пишем: делитель = 1 ---› частота ШИМ 62000 Гц т.е.
TCCR0B=TCCR0B&0b11111000|0x01;
На частотомере получаем совсем не 62000 Гц а 31250 Гц.
При дальнейшем изменении значений константы "0х01" понял что пост перемешан.
от сюда следует:
ТАЙМЕР/СЧЕТЧИК 0 (8bit)
TCCR0B=TCCR0B&0b11111000|‹константа›;
Константа | Делитель Частота(Гц)
0x01| 1 31250
0x02 | 8 3906.25
0x03 | 64 488.28125
0x04 | 256 122.0703125
0x05 | 1024 30.517578125
-----------------------------------------------------------
ТАЙМЕР/СЧЕТЧИК 1 (16bit)
TCCR1B=TCCR1B&0b11111000|‹константа›;
Константа Делитель Частота(Гц)
0x01 1 62500
0x02 8 7812.5
0x03 64 976.5625
0x04 256 244.140625
0x05 1024 61.03515625
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:54.
|
|