В уроке 11, мы уже изучали принцип формирования произвольного сигнала, при помощи ШИМ. Однако, у такого метода есть недостаток — низкое быстродействие. Когда необходимо получить высокую скорость применяют цифро-аналоговое преобразование (ЦАП).
Для начала попробуем решить простенькую задачку. Есть схема из резисторов. Два входа и один выход. Как вы думаете сколько уровней напряжения можно получить на выходе?
Рассуждаем логически, вход может быть либо включен, либо выключен, т.е. 2 состояния, количество входов 2. Таким образом, правильный ответ 2^2=4. Рассмотрим эти варианты, в порядке возрастания напряжения на выходе.
Первый вариант получается при подаче на вход1 и вход2 нуля. На выходе, соответственно тоже ноль.
Вариант 2. Самым минимальным напряжение на выходе будет, если подключить источник напряжения к входу1, в этом случае часть тока пойдет через резистор R1, и часть через R3 и R4, соответственно на всех резисторах будет падать напряжение. Расписывать расчет не буду, иначе получится слишком длинно.
Вариант 3. Чуть больше напряжение будет, если подать напряжение на вход2, в этом случае резисторы R2 и R1 оказываются подключены параллельно, так как они имеют одинаковое сопротивление, то их общее сопротивление будет в 2 раза меньше, соответственно напряжение будет падать меньше. Без бумаги видно, что сопротивление цепочки R3, R2, R1 будет 10К, т.е. R4 с R321 будет образовывать делитель из одинаковых резисторов, что и видно на вольтметре.
Следующий вариант. Здесь выходное напряжение будет определяться, только падением напряжения на резисторе R4.
Подобная схема называется R2R. Обратите внимание, что напряжение изменяется с одинаковым шагом. Количество задействованных входов, называется разрядностью ЦАП и напрямую влияет на количество уровней напряжений на выходе. Если бы у нас было 3 входа, то количество уровней напряжения стало бы 2^3=8. Так как сигнал имеет только определенные уровни, то формировать сигнал можно только ступенчато. Соответственно, чем выше разрядность, тем более плавно мы сможем изменять сигнал на выходе.
Теперь к основной схеме. Задача получить треугольный сигнал. Универсальным решением, на все случаи жизни — использование 8-битного ЦАП, позволяющего получить 256 значений напряжения. Крайне важно, чтобы резисторы имели не большие различия в номиналах, желательно не более 1%.
#include <mega8.h> #include <delay.h> int triangle[10] = {0,1,2,3,4,5,4,3,2,1}; int i=0; void main(void) { // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0xFF; while (1) { for(i=0;i<10;i++) { PORTD=triangle[i]; delay_ms(1); }; }; } |
Все просто, есть массив с значениями функции, эти значения по очереди заносятся в порт. Задержка влияет на частоту сигнала. Если необходим точный сигнал задержку можно сформировать, при помощи таймера. Также важно количество используемых значений в функции, оно напрямую будет влиять на результирующую частоту.
Для наглядности пример треугольника использующего 10 значений, и 32.
Поэтому нужно искать компромисс между скоростью и качеством. Подобным образом можно сформировать любой тип сигнала, в том числе, подобный подход применяется при воспроизведении wav файлов. О чем мы поговорим позже.
Прошивка
Простите, я так понял что в порт можно вывести 255 значений? И если подключить резистора через оптопары, то можно сделать управляемый микроконтроллером переменный резистор?
вроде того
Есть путь проще чем резисторы и паралельный порт https://e2e.ti.com/support/data_converters/precision_data_converters/f/73/t/40736
быстродействие на SPI падает