3

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

1
  • Похоже эта тема перенесена с hashcode.ru, и перенесена криво - картинка со схемой в низком разрешении((. Можете ли поделится проектом схемы для протеуса, или схемой в оригинальном разрешении? Спасибо 7 мая 2020 в 14:30

1 ответ 1

12

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

На выше приведенной схеме я расположил три кнопки. При нажатии на первую Вы увидите полупилообразный сигнал, на вторую вожделенную Вами синусоиду(многие из желания сэкономить ресурсы МК сначала создают таблицу массив с уже рассчитанными величинами для синуса, и далее по очередности вызываю каждое значение, с целью не утруждать МК вычислениями, а некоторые МК не умеют попросту умножать!). При нажатии на третью кнопку Вы увидите очертания города Нью-Йорк или Сидней. Так перейдем к программе, она ниже! Если возникнет вопрос что такое 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) Полупилообразный сигнал

alt text

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

alt text

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

alt text

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

alt text

7
  • Спааааааасибо! Пошел тестить. А Вы нигде блогов не ведете? Хотелось бы побольше узнать о Ваших работах! Спасибо еще раз за такие прекрасные ответы! 18 мая 2013 в 16:38
  • Нет блогов нигде не веду. Есть желание попробовать на хабре, но там мне сказали нужен инвайт, а времени пока нет! Рад, что смог помочь. Видите ли ХэК прекрасная среда, но здесь в основно программисты не работающие с железом, и хотелось бы, чтобы таковые здесь появились! 18 мая 2013 в 16:41
  • Ничего не понял, но плюсанул. А почему у тангенса такой странный график? Сигнал берется по какому-то модулю?
    – dzhioev
    18 мая 2013 в 18:29
  • Особенность в том, что когда тангенс не существует сигнал в этом месте падает в ноль, и учитываю что функция с этими кф. ведет себя непонятно(для меня так как не пытался апроксимировать ее), показал чтобы объяснить что возможно в ринципе очень многое. 18 мая 2013 в 18:38
  • 1
    Вспомнилась фраза из "Электроники" 80х годов (был такой журнал -- перевод "Electronics"). За точность не ручаюсь, но... Современный инженер не может даже создать схему для генерации синусоиды, а использует для этого микропроцессор.
    – alexlz
    20 мая 2013 в 2:17

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.