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

444
19 декабря 2016, 19:56

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

Answer 1

Никаких сложностей это не должно для Вас сотавлять, если Вы смогли повторить предидущий пример. Начну поэтапно, и попробую дать более менее развернутый ответ! 1. Собираем следующую схему.

На выше приведенной схеме я расположил три кнопки. При нажатии на первую Вы увидите полупилообразный сигнал, на вторую вожделенную Вами синусоиду(многие из желания сэкономить ресурсы МК сначала создают таблицу массив с уже рассчитанными величинами для синуса, и далее по очередности вызываю каждое значение, с целью не утруждать МК вычислениями, а некоторые МК не умеют попросту умножать!). При нажатии на третью кнопку Вы увидите очертания города Нью-Йорк или Сидней. Так перейдем к программе, она ниже! Если возникнет вопрос что такое PINC.0 - это примитивная обработка прерываний на МК(порт на котором сидит кнопка настроен на вход), так вот при подаче на него 5В то есть лог 1, он сгнализирует нам об этом. Некоторые делают так: PINC.0 == 1, но это в нашем случае ни к чему, так как и так сработает. Программа ниже:

#include <mega32.h>
#include <math.h>
#include <delay.h>
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) Очертания прекрасных городов!

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

READ ALSO
Односвязный список в список

Односвязный список в список

Всем приветОбъясните пожалуйста, как добавить один односвязный список в другой

350
Изъятия текста из диалогового окна (winApi)

Изъятия текста из диалогового окна (winApi)

Почему, когда я считываю текст из BoxEditor диалогового окна, или же вызываю диалог открытия/сохранения файла, то текст у меня сохраняется в элементы...

298
Потери данных при записи аудио потоков (Linux 64bit)

Потери данных при записи аудио потоков (Linux 64bit)

Уважаемые профи! Написал программу записи нескольких потоков аудио данных с АЦП(специальная плата PCI)Программа работает, но при прослушивании...

262