Сообщение от diglook
|
Нужна синусоида 1872+-5 гц(надеюсь приемник проглотит). От ШИМ отказался - будет паралельный ЦАП R2R на 6 бит(PORTB.0 -PORTB.5), длина таблицы - лишбы нормально получилась частота, места хватает. Следующая задача , видимо в том же обработчике прерывания, разворот фазы на 180 - здесь для меня вродебы все ясно, при условии что от длинны обработчика частота не намного будет уходить. еще одно прерывание прием данных по UART здесь тоже все понятно. Основная заморока в том чтобы весь код с его ветвлениями не влиял особенно на частоту несущей 1872+-5.
|
1) При частоте 14745600/ 256 = 57600.
2) 57600 / 1872 = 30,769230769230769230769230769231
3) 800 / 30,769230769230769230769230769231 = 26.
Ошибка = 0.
Соответственно вам надо сформировать таблицу синуса с шагом 2*Pi/800.
При выводе выводить с шагом 26. Разворот фазы на 180 - есть смещение в таблице на 400. Это очевидно.
Теперь следующее. "Основная заморока в том чтобы весь код с его ветвлениями не влиял особенно на частоту несущей 1872+-5.".
![Улыбка](images/smilies/icon_smile.gif)
Просто меня в шок вводите. Это надо умудриться "повлиять" на несущую. Немного от смеха отойду.
Так.
Частоту вы не измение, если будите выводить в прерывании. Конечно ШИМ в этом отношении лучше, так как вывод аппаратный, но при программном выводе при отсутствии прерывания от USART у вас будет дрожание ~ 3 такта. Что несколько ухудшит качество вывода (то бишь добавит искажений к сигналу), но частоту никак не изменит.
Про какие ветвления ведём речь? Если в голове, то они по-барабану. Если в прерывании, то делаем следующим образом...
В прерывании объявляем переменную типа так
uint8_t static last_out;
Первой операцией прерывания у вас будет:
PORTB = last_out;
далее идут все ваши перетурбации вместе с ветвлениями и результат вы заносите в ваш last_out.
Надеюсь с этим всё.
Прерывание от RS232 надо мне увидеть. Я его откорректирую, чтобы всё работало с минимальным джиттером и величину его вам скажу по факту.
Хотя, по хорошему, надо на асме. Короче это надо смотреть.