Извиняюсь. Не правильно понял. Спасибо. Заработало.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Здравствуйте, уважаемые. Очень надеюсь на вашу помощь. Делаю преобразователь 12/220, 50 Гц с синусом на выходе. Подобие синуса хочу формировать микроконтроллером. Дело такое, есть attiny2313, требуется выводить последовательно на разные выводы последовательность байт ( ШИМ, чтобы создать грубое подобие синусоиды вида "0010110111011111101110110100", это верхний полупериод (пойдёт на один ключ полумоста), аналогично на другой пин будет выведено тоже самое для нижнего полупериода. Похожих решений нигде не нашёл, поэтому прошу помощи, как примерно реализовать программу (на Cи или ассемблере). Чтобы не связываться с таймерами, чем проще, тем лучше. AVR будет только формировать ШИМ.
Часто делают массив значений ШИМа, хотя бы четверти периода, и по таймеру меняют его же ШИМ. В ATtiny2313 даже на Т0 два канала. Например, настроить OC0A и OC0B (OC1A и OC1B расположены удобнее, но для примера это не важно) на аппаратный ШИМ, а в прерывании по переполнению меняем номер выводимого отсчета и записываем его в OCR0A, OCR0B. В ATtiny25/45/85 можно добавить аппаратное "мертвое время", в tn2313 наверное придется делать его вручную.
Что объяснить? Про ШИМ написано и в даташите и у Евстифеева (перевод и компиляция даташитов), повторять это на форуме не имеет смысла.
Про создание массива в общем-то довольно просто. Массив из 256 значений в флеш-памяти, соответствующий значениям синуса по всему периоду, смещенная к середине диапазона char, то есть 127. Получается, значение элемента массива вычисляется по формуле arr[x] = 127+127*sin(2*PI*x/256). Поскольку расчет идет перед компиляцией, вычисление синуса не страшно, массив можно хоть в calc делать. По таймеру (прерывание по переполнению, например) увеличиваете счетчик и берете из массива элемент с индексом, равным счетчику, записываете его в регистры сравнения ШИМ. На соответствующих выходах - синусоида.
harrd писал(а):...нужен чистый ШИМ, для подачи на силовые ключи
По мне, чтобы получить чистый ШИМ для всего диапазона, выражение из предыдущего сообщения нужно представить так CODE=128+120*sin(2*pi*X/256). Т.е. будет формироваться синусоида с амплитудой 120 единиц, смещённая на 128 единиц и не будет срыва формирования в экстремальных точках.
Доброго времени суток
Начал изучать ассемблер с книги "МК AVR. Вводный курс", автор Мортон. Читал, что в ней много ошибок. Так вот, нужно поочередно включать светодиоды, скорость регулируется двумя кнопками от 0.1 до 1 Гц. Тактовая частота 2.4576 МГц. Суть в том, что частота таймера делится на 1024, получается 2400 Гц. За один цикл отсчитываем 240, получаем 0.1 Гц и используем переменные counter и speed, чтобы задавать количество циклов.
Программа простая и более-менее понятная, запустил в протеусе - первые несколько переключений делает вроде верно (быстро), а потом переходит на частоту 1 Гц и на нажатия кнопок не реагирует. Много раз пересматривал программу - ошибок не нашел. Очень прошу помощи Скриншоты прилагаю.
МК - AT90S1200
Была мысль, что МК 8-битный, а в переменную mark240 записывается число, большее, чем 255. Но если при превышении значения 255 от значения переменной отнимается 255 (т.е. нужно записать число 260, записывается 5) и таймер считает точно также, то проблема не в этом
Если генерировать синус из таблицы в 256 байт для экономии места можно расположить только четверть периода в 64 байта и пересчитывать остальные недостающие. Или сейчас уже не актуально экономить с такими большими флешами ?