реклама на сайте
подробности

 
 
> генерация частот
Митя
сообщение Sep 10 2010, 15:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 15-08-07
Пользователь №: 29 802



Нужно сформировать на 6 ножках
прямоугольники с частотами
349 370 415 440 494 523 Гц.
как это можно сделать на тине или меге небольшой?
Как можно достичь большей точности?
Больше ничем процу можно не заниматься.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SAWushka
сообщение Sep 12 2010, 19:58
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 1-12-07
Пользователь №: 32 868



1111493779.gif

Как то так, отставать будет на десяток - другой циклов, считать лень. Частота будет довольно точная, к примеру для кварца 20МГц, и без всяких предделителей 349Гц превратится в 349.0036 Гц, и небольшое запаздывание, в пределах пары микросекунд.
Код для Tiny2313. Частоты могут быть разными, очень разными. В разумных пределах конечно.

Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define INV_B(x) ^=(1<<x)
#define SET_B(x) |= (1<<x)
#define BitIsClear(reg, bit) ((reg & (1<<bit)) == 0)

#define F 20000000

#define f1 550
#define f2 560
#define f3 570
#define f4 580
#define f5 590
#define f6 600

#define n1 (F/(2*f1))
#define n2 (F/(2*f2))
#define n3 (F/(2*f3))
#define n4 (F/(2*f4))
#define n5 (F/(2*f5))
#define n6 (F/(2*f6))

volatile unsigned char overflow;
volatile unsigned int N1,N2,N3,N4,N5,N6;


///////////////////////////////////////////
/////////     ISR TIMER0_OVF   ////////
///////////////////////////////////////////
ISR (TIMER1_OVF_vect)
{
    overflow =0;
    
    if (N1>n1)
        {
        PORTB INV_B(1);                    
        N1=N1+n1;                        
        }

    if (N2>n2)
        {
        PORTB INV_B(2);                    
        N2=N2+n1;                        
        }

    if (N3>n3)
        {
        PORTB INV_B(3);                    
        N3=N3+n3;                        
        }

    if (N4>n4)
        {
        PORTB INV_B(4);                    
        N4=N4+n4;                        
        }

    if (N5>n5)
        {
        PORTB INV_B(5);                    
        N5=N5+n5;                        
        }

    if (N6>n6)
        {
        PORTB INV_B(6);                    
        N6=N6+n6;                        
        }
}


///////////////////////////////////////////
/////////          MAIN      ////////
///////////////////////////////////////////

int main(void)
{    

    overflow = 0;
    N1=n1; N2=n2; N3=n3; N4=n4; N5=n5; N6=n6;
    
    TCCR1B = (0<<CS12)|(0<<CS11)|(1<<CS10);    
    TIMSK = (1<<TOIE1);
    sei();

    while (1)
    {
        
            ////// 1  /////
        if ((TCNT1>=N1)&(BitIsClear(overflow,1)))
            {
                PORTB INV_B(1);                    
                N1=N1+n1;                        
                if (N1<n1) overflow SET_B(1);    
            }                                    
    
            ////// 2  /////
        if ((TCNT1>=N2)&(BitIsClear(overflow,2)))
            {
                PORTB INV_B(2);
                N2=N2+n2;
                if (N2<n2) overflow SET_B(2);
            }

            ////// 3  /////
        if ((TCNT1>=N3)&(BitIsClear(overflow,3)))
            {
                PORTB INV_B(3);
                N3=N3+n3;
                if (N3<n3) overflow SET_B(3);
            }

            ////// 4  /////
        if ((TCNT1>=N4)&(BitIsClear(overflow,4)))
            {
                PORTB INV_B(4);
                N4=N4+n4;
                if (N4<n4) overflow SET_B(4);
            }

            ////// 5  /////
        if ((TCNT1>=N5)&(BitIsClear(overflow,5)))
            {
                PORTB INV_B(5);
                N5=N5+n5;
                if (N5<n5) overflow SET_B(5);
            }

            ////// 6  /////
        if ((TCNT1>=N6)&(BitIsClear(overflow,6)))
            {
                PORTB INV_B(6);
                N6=N6+n6;
                if (N6<n6) overflow SET_B(6);
            }
    }
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Митя   генерация частот   Sep 10 2010, 15:36
- - =GM=   Шесть программных ШИМ плюс шесть фильтров плюс шес...   Sep 10 2010, 16:31
- - adc   Самый простой способ без премудростей, как сказал ...   Sep 11 2010, 05:49
|- - Grechko   Цитата(adc @ Sep 11 2010, 08:49) Самый пр...   Sep 11 2010, 07:34
- - adc   Цитата(Grechko @ Sep 11 2010, 11:34) Буде...   Sep 11 2010, 13:44
|- - 777777   Посмотри ATmega32/64M1, там есть Power Stage Contr...   Sep 12 2010, 10:05
||- - Oldring   Цитата(777777 @ Sep 12 2010, 14:05) Посмо...   Sep 12 2010, 10:17
||- - 777777   Цитата(Oldring @ Sep 12 2010, 14:17) Его ...   Sep 13 2010, 03:57
||- - Oldring   Цитата(777777 @ Sep 13 2010, 07:57) При ч...   Sep 13 2010, 08:34
|- - rx3apf   Цитата(adc @ Sep 11 2010, 17:44) Вопрос в...   Sep 12 2010, 10:36
- - Митя   >Шесть программных ШИМ плюс шесть фильтров плюс...   Sep 12 2010, 16:12
|- - Oldring   Цитата(Митя @ Sep 12 2010, 20:12) к сожал...   Sep 12 2010, 16:51
|- - =GM=   Цитата(Митя @ Sep 12 2010, 15:12) Что-то ...   Sep 13 2010, 14:47
- - Митя   Спасибо за пример! Попробую в этом направлении...   Sep 19 2010, 07:25


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 00:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016