Консультация № 28141
22.10.2005, 23:37
0.00 руб.
0 3 1
Уважаемые Эксперты,раскажите,пожалуйста подробно, как вывести одновременно в контр.AT89C2051 ,на одну ногу 700 гц,на другую 900 гц, на третью 1100,...1300,...1500,...1700 гц . форма синус ,а если нет то цифра. Спасибо.

Обсуждение

Неизвестный
23.10.2005, 18:34
общий
это ответ
Здравствуйте, Pettimm!
Насколько я понимаю, такого количество таймеров в контроллере нет? Тогда частоты необходимо синтезировать. Формула синусоиды:
y = a*sin (2*pi*f*t), где
y - выходной сигнал,
a - амплитуда,
f - частота,
t - время.
Дальше создается цикл, который выводит на каждую ногу контроллера (а там цапы стоят?) выходной сигнал ("у" в формуле) и увеличивает значение времени t. Чем больше раз в секунду данный цикл сможет выполняться, чем больше будет частота дискретизации, а значит синусоиды получатся более качественными. Для синтеза частоты 1700 гц более менее синусоидальной формы необходимо, чтобы цикл мог выполняться хотя бы по 8 раз на один период сигнала (т.е. 1700*8 раз в секунду).
Естественно, что считать синус "на лету" слишком долго, поэтому на практике создают в памяти таблицу синуса. Удобно, чтобы ее размер был равен 2^n, где n - какое либо число, например 8. Формулу в приведенном мной виде опять же использовать нецелесообразно, т.к. всех этих умножений можно избежать. Вот пример на асме х86, под контроллер переведешь сам (см. приложение).
В программе используется 256-ти байтная таблица синуса, каждый байт которой представляет отдельное значение. переменная sin1pos содержит "позицию" первого генератора. Старшие 8 бит позиции отражают реальную позицию в таблице синуса, а младшие 24 используются для повышения точности синтезируемой частоты. Скорость sin1spd определяет выходную частоту и рассчитывается исходя из того, сколько раз в секунду будет выполняться данный цикл (на контроллере можно либо повесить его на прерывание, которое вызывать с заданной частотой по таймеру, либо просто рассчитать скорость выполнения исходя из количества тактов требуемых для каждой команды и тактовой частоты (на спектруме можно было применять только второй вариант)). Если, например, ты хотел бы синтезировать частоту 1 Гц, а цикл выполнялся бы у тебя 256 раз в секунду, то скорость должна была бы быть равна 0х01000000. Если бы 512 раз в секунду - то 0х00800000 и т.п.

Приложение:
sintbl db ..... ; sinus table is defined heresin1pos dd 0 ; current position of the first generatorsin1spd dd ? ; speed of the first generator...cycle: mov eax, [sin1pos] add eax, [sin1spd] mov [sin1pos], eax shr eax, 24 mov al, [offset sintbl + eax] ; here al = output level ... jmp cycle
Неизвестный
24.10.2005, 10:40
общий
1)Мне не понятно вычисление скорости при синтезе частоты 1 Гц(по какой формуле?) Например при кварце 12Мгц ,цикл выполняется : маш.цикл=12 периодам резонатора _12Т=12(1/f), так как Т=1/f , при резонаторе 12 Мгц период выполняется 1000000 раз. Какая будет скорость? 2)Что означает выражение 0х01000000 ,х-? 3) sintbl db .... (db .... -? ,может десятично -двоичное число ? и что такое dd ?) ,sin1spd dd ? ,что вместо "?"4)В чем будет разница при переводе с асма х86 на асм 51?Простите малоопытного ,за то что много вопросов.Спасибо...
Неизвестный
24.10.2005, 21:11
общий
1. ну допустим у тебя кварц 12 мгц. Насколько я помню, с51 выполняет каждую команду за 12 тактов (т.е. 1 миллион команд в секунду). Далее, ты выбрал вариант без использования таймера и пусть в твоем цикле 100 команд. Это значит, что такой цикл будет выполняться 10 000 раз в секунду. Значит значение скорости для заданной частоты будет определяться так:speed = (f*256*2^24)/10000256 – это размер таблицы синуса, 2^24 – коэффициент умножения (поскольку младшие 24 бита у нас введены только для повышения точности), а 10000 – это частота выполнения цикла.Если f = 5Кгц (а это предел, что можно получить при 10000 раз выполнения в секунду), то скорость = 5000*256*2^24/10000 = 0х80000000 и т.п.2. это шестнадцатеричное число. 0х01000000 = 16777216.3. это я просто так описал место, где должна быть таблица синуса. Конкретная имплементация будет зависеть от компилятора.Db – это определение байта, dd – двойного слова (32-х разрядного числа).Вместо dd ? должна стоять скорость генератора, которую ты рассчитаешь.4. я не знаю асма 51-го контроллера… основная проблема – это разрядность. Он точно не 32-х разрядный. 16-ти разрядов хватит для синтеза частоты с приличной точностью, а вот 8-ми нет. Если он 8-ми разрядный, значит надо будет искусственно создавать 16-ти разрядные регистры объединением двух 8-ми разрядных.
Форма ответа