Страницы

Поиск по вопросам

понедельник, 1 апреля 2019 г.

Как сгенерировать синусоиду на СИ

Привет всем участникам форума! В прошлый раз я задавал вопрос по поводу генерации пилы с использованием СИ на AVR. Кроме @vanyamelikov мне никто не отвечал, поэтому обращаюсь к Вам! Как же мне сгенерировать синусоиду используя ту же схему, что Вы предложили в прошлом ответе Заранее спасибо.


Ответ

Никаких сложностей это не должно для Вас сотавлять, если Вы смогли повторить предидущий пример. Начну поэтапно, и попробую дать более менее развернутый ответ! 1. Собираем следующую схему.
На выше приведенной схеме я расположил три кнопки. При нажатии на первую Вы увидите полупилообразный сигнал, на вторую вожделенную Вами синусоиду(многие из желания сэкономить ресурсы МК сначала создают таблицу массив с уже рассчитанными величинами для синуса, и далее по очередности вызываю каждое значение, с целью не утруждать МК вычислениями, а некоторые МК не умеют попросту умножать!). При нажатии на третью кнопку Вы увидите очертания города Нью-Йорк или Сидней. Так перейдем к программе, она ниже! Если возникнет вопрос что такое PINC.0 - это примитивная обработка прерываний на МК(порт на котором сидит кнопка настроен на вход), так вот при подаче на него 5В то есть лог 1, он сгнализирует нам об этом. Некоторые делают так: PINC.0 == 1, но это в нашем случае ни к чему, так как и так сработает. Программа ниже:
#include #include #include
void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0xFF; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; UCSRB=0x00; ACSR=0x80; SFIOR=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83; SPCR=0x00; TWCR=0x00;
while (1) { int i; if (PINC.0) { for(i = 0; i <255; i++) { PORTB = i; } } else if(PINC.1) { for(i = 0; i <255; i++) { PORTB = 127 + 127 * sin(3.14 * i * 0.007843); } } else if(PINC.2) { for(i = 0; i <255; i++) { PORTB = 127 + 127 * tan(3.14 * i * 0.007843); } } } }
И так посмотрим, что же у нас получилось:
1) Полупилообразный сигнал

2) ВОЖДЕЛЕННАЯ СИНУСОИДА

3) Очертания прекрасных городов!

А ниже Вы видите как же он пошагово выстраивает ту или иную кривую!

Комментариев нет:

Отправить комментарий