Використовуємо ШІМ для побудови синусоїди на ATmega8, Прикладне програмування з нуля
AVR, STM, Android, IoT. Вбудовані системи.
Крок №26. Використовуємо ШІМ для побудови синусоїди на ATmega8
Привіт дорогі читачі. Минулого разу ми розглянули застосування контролера для перевірки реле. У цій статті розберемо роботу самого контролера. Отже все "крутиться" навколо генерування синусоїди. Розглянемо процес генерування. Тут нам не обійтися без ШІМ.

Налаштовуємо таймер Т2. Налаштовуємо регістр керування таймера/лічильника ТССR2=0×69. Вибираємо режим роботиFastPWM, висновок за рівності регістрів OCR2 і TCNT2 скидається в 0, і джерело тактового сигналу – частота контролера без дільників. Таймер налаштували. Щоб отримати синусоїду, природно ШІМ повинен змінюватися за певними значеннями, які ми заносимо до масиву. Тобто. у кожний час OCR2=sin_table[i]. При кожному кроці інкрементуємо порядковий номер. Відповідно змінюється шпаруватість вихідного сигналу.
Далі розберемося де братимемо значення для побудови графіка. Є два варіанта. Перший: Значення масиву ми можемо занести ще у вихіднику, наприклад
,85,79,73,68,62,57,52,47,42,38,33,29,25,22,19,15,13,10,8,6,4,3,2,1,1 ,0,1,1,2,3,4,6,8,10,13,15,19,22,25,29,33,38,42,47,52,57,62,68,
73,79,85,91,97,103,109,115,121>;
Другий: розраховуємо за формулою прямо у програмі. Я вибрав другий варіант. Будемо використовувати математичну бібліотеку, функцію sin(x). Сигнал змінюється від -1 до 1. Негативну напругу ми не згенеруємо, тому піднімаємо графік на 1 по осі Y. Сигнал змінюється від 2 до 0, формула набуває вигляду: sin(x)+1. Т.к. ШИМ у нас 8-бітний, то максимальне значення 255, до множимо нашу формулу на 127, щоб максимально наблизиться до 255, отримуємо 254 іформула має вигляд: (sin (x)+1)*127. Номер значення, що підставляється в функцію, запишемо наступним чином 2*p/MAX_INT. Постійна MAX_INT – дає можливість нам задавати дозволибудування синуса. І отримаємо таку формулу:
sin_table[i]=(byte)((sin ((float) j*(2*p/MAX_INT))+1.0)*127.0);
де j - Порядковий номер елемента.
Дана формула у нас розраховується один раз на початку пуску програми, або при повторній ініціалізації функції. Чому повторною, це ми розглянемо далі.
Нижче наведено функцію розрахунку точок синуса.