В одном из ранних уроков мы узнали, что при помощи ШИМ можно изменять скважность сигнала. Тем самым регулировали яркость свечения светодиода. Однако есть более интересный способ, использования широтно-импульсной модуляции.
Итак… Если пропустить генерируемый сигнал через фильтр низких частот, то получится постоянное напряжение.
Так как скважность изменяется от 0 до 0xFF(255), значит у нас будет 255 уровней постоянного напряжения. Проще говоря, есть диапазон напряжения, допустим от 0 до 5В, этот диапазон разбивается на 255 значений. С шагом 5/255=0,0196В можно выставить любое напряжение.
Используя в определенном порядке эти значения, можно получить практически любую форму сигнала. Например, увеличивая заполнение от 0 до 255, а потом уменьшая от 255 до 0 получим пилообразный сигнал.
Теперь перейдем к конкретной цели: получить синусоиду с частотой 50Гц с помощью микроконтроллера Atmega8. Глобальная задача — выставлять через определенные промежутки времени напряжение на выходе ШИМ, по синусоидальному закону.
Разберемся с первой частью задачи. Для того, получить определенные промежутки времени воспользуемся таймером. Допустим таймер настроен на частоту 8МГц, т.е. он будет тикать 8000000 раз в секунду. Синусоида колеблется 50 раз в секунду, значит на один период может приходиться 8000000/50=160000 тиков максимум. Раз у нас 256 уровней напряжения, то и максимальное разрешение синусоиды будет равняться 256.
Что же такое разрешение синуса? В данном случае это количество точек за период по которым построена синусоида. Для примера я построил в Excel, то как будет выглядеть синусоида для разного разрешения.
Для синуса с разрешением 4:
Для синуса с разрешением 8 точек:
Для синуса с разрешением 16 точек:
Думаю «эволюция» синуса наглядно видна — чем больше точек(разрешение), тем меньше угловатостей и тем больше он похож на нормальную синусоиду. В итоге я решил остановиться на разрешении синуса в 128 точек.
Теперь объединяем все сказанное ранее, 160000 тиков делим на разрешение 128 получаем 1250 — через столько тиков должно сработать прерывание, чтобы выставить следующий уровень напряжения. Значение 1250 нужно пихать в регистр сравнения OCR1A
OCR1AH=0x04;
OCR1AL=0xE2;
Вторая часть глобальной задачи — как построить синусоиду. Вспомним математику :D… Синус изменяется от -1 до 1. ШИМом сгенерить отрицательное напряжение не получится. Поэтому нужно сместить график над осью Х — sin(x)+1. Теперь он будет изменяться от 0 до 2, тоже не вариант, т.к. у нас 256 значений напряжения, поэтому умножим на 127, чтобы максимальным было значение 256. В итоге откопал такую формулу:
128 — разрешение синуса, х — номер точки по (от 0 до 128). Сосчитал в Excel, получился массив sin[] из 128 значений, которые по очереди подставляются в OCR2.
Последнее о чем стоит упомянуть — фильтр низких частот, возможно в ближайшее время появится урок по фильтрам. В данный момент, формулы для его расчета не имеет смысла приводить, т.к. есть сайты с возможностью онлайн расчетов, достаточно набрать «фнч» в гугле.
Файл прошивки и протеуса
Что такое дискретизация.Так вот это неполнение синуса шимом сигнала.Есть информация что она должна быть с частотой от 4Кгц -12Кгц.
Иван, никто никому не должен)) Все до элементарного тупо, у вас есть шкала времени и напряжения. Чем по времени чаще вы будете устанавливать уровень сигнала, тем больше он будет похож на синусоиду. Чем больше разрядность шима, тем точнее вы сможете выставить нужный уровень напряжения, тем больше он будет похож на синусоиду. Какие параметры выбрать вы решаете самостоятельно в зависимости от задачи.
Задача сделать частотник.А там другие параметры ШИМа от 4-12КГц.В вашем проекте 31КГц.Сверхзвуковая частота.
советую вам прочитать про то, как работают таймеры и как работает шим, т.к. судя по комменту вы полностью этого не понимаете
Понял .Но частота 31 Кгц для частотника большая.Нужно играться программно и с фильтрами поиграться.
Если понятно, то объясните, где вы там увидели 31кГц?
Автору низкий поклон! Нигде не мог найти объяснение этого процесса. А тут все четко и лаконично. Большое спасибо!
Сделал расчёт вышло 31 347.962 Гц.Может я не прав?
Иван, приведите расчеты, что вы считаете, какой таймер т1? т2?
Ну ШИМ я так понимаю в таймере 2 .А насчёт 1 таймера я не знаю как расчитать он 16 битный .
Если на 1 таймере ШИМ расчитывать.
Иван вы не разобрались с ШИМ, с тем как он работает и для чего он нужен, на этом сайте есть статьи с картинками и даже видосами.
Я не буду спорить .У вас таймер 2 настроен на работу ШИМа вот я его и расчитал.Посмотрю я ваши видосы.
Тогда скажите мне какова частота вашего ШИМ сигнала и по какой формуле можно определить?Я ШИМ настраивал в AVR и STM32.Но как определить частоту шим на таймере так и не понял.Тут она будет не постоянной так как синус .А средняя.?
разделите кашу, есть отдельно шим, есть отдельно синус, одно к другому не имеет отношения. начните с того что есть шим http://avr-start.ru/?p=367 у шима частота фиксированная