Страница 1 из 1

485 кГц->Тини13->синус 100 Гц

Добавлено: Пт апр 24, 2009 16:33:50
snayperAlfa
Усем привет!
Поменялись тут условия задачки. Подмогните плиз способ ее решения.
Есть внешний генератор на 485 кГц. Частота поступает на Тини13. На выходе необходимо получить положительные полуволны синуса частотой 100 Гц. Это как синус 50 Гц после диодного моста без конденсаторов. Такую вот форму сигнала надо получить. Частоту к сожалению изменить нельзя. Количество отсчетов изменить впринципи можно, главное чтобы это не сильно плохо повлияло на синус.

Вот код который я сообразил, но к сожалению не работает так как надо.

Код: Выделить всё

#include <tiny13>

flash char mas_128[]={1,1,1,2,3,4,5,6,6,8,8,9,10,11,12,13,14,14,
15,16,17,18,19,19,20,21,21,22,23,24,24,25,
26,26,27,28,28,29,29,30,30,31,31,32,32,32,
33,33,34,34,34,35,35,35,35,36,36,36,36,36,
36,36,36,36,36,36,36,36,36,36,36,36,36,36,
35,35,35,35,34,34,34,33,33,33,32,32,31,31,
30,30,29,29,28,28,27,26,26,25,24,24,23,22,
22,21,20,19,19,18,17,16,15,14,14,13,12,11,
10,9,8,8,7,6,5,4,3,2,1,1};
bit in=0;
int next = 0;

interrupt [TIM0_COMPA] void a1(void){
if(in==0){   
PORTB.0=0; 
 in=1; 
 OCR0A=mas_128[next]; 
   if(next<128){  
   next++;   }  
 else{  
   next=0;   }
}else{   
  PORTB.0=1;
   OCR0A=37-mas_128[next]; 
  in=0;   }   
  }void main(void){
#asm("cli")
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x00;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_#pragma optsize+#endif

DDRB.0=0b11111;
TCNT0=0;
OCR0A=60;
TCCR0A=(0<<7 )| (0<<6) | (0<<5) | (0<<4)  | (1<<1) |(0<<0);
TCCR0B=(0<<7 )| (0<<6)  | (0<<3) | (0<<2) | (0<<1) | (1<<0);
TIMSK0=(1<<2);
// Global enable interrupts
#asm("sei")
while (1)      {      // Place your code here      };}
Компилятор: CV AVR 2.03.4
Симуляция в Протеусе и прошивка

Добавлено: Пт апр 24, 2009 17:49:59
Mamonth
Ничего не понял...
Как связаны генератор на 485 кГц и синус 100 Гц?
Они как-то друг на друга влияют? Или 485 кГц тактуют тиньку?
Нужен делитель?

Добавлено: Пт апр 24, 2009 19:04:33
snayperAlfa
485 кГц тактуют Тини. На выходе OCOA стоит фильтр который самопальный ШИМ преобразует в синус.

Надо сделать: на выходе получить положительные полуволны синуса частотой 100 Гц.

Добавлено: Пт апр 24, 2009 19:40:29
ARV
исправьте код так, чтобы влез целиком на дисплей без горизонтальной прокрутки!

Добавлено: Пт апр 24, 2009 20:36:36
SeamaNCOS
Короче говоря надо в тиньке13 разделить сигнал с частотой 485 кГц на 4850 и выдать на порт А (с частотой 100Гц) я привильно сформулировал задачу?

Положительные ПолуволнЫ после диодного моста в двоичной системе это всегда+!!!! какой сигныл подовать на ШИМ ????

В си неселен (вообще не понимаю) а в асме написал бы за несколько минут такую прогу (какая пошрешность преобразования допустима для сигнала на порте А при стабильном тактировании 485 кГц )

Добавлено: Пт апр 24, 2009 21:04:34
snayperAlfa
Можно и на асме.
Погрешность чем меньше тем лучше.

До этого я реализовал синус 50 Гц на частоте 9.6 МГц от внутреннего генератора. Но там я использовал другой принцип: фккумулятор фазы, приращение фазы. Там задача облегчалась за счет большой частоты. Использовал Fast PWM

А при 485 кГц мой предыдущий способ решения не катит. :(

Мои приблизительные расчеты:

Длинна 1 такта: 1/485000 = 2,06 мкс.

Длинна 1 положительной полуволны синуса частотой 100 Гц:
1/100=0,01 с.

Допустим использовать 128 отсчетов из таблицы синуса на 1 полуволну. Тогда длинна 1 такого полного отсчета: 0,01/128 = 78,125 мкс.

Значит у меня есть 78,125 мкс на формирование 1 значения из таблицы синусов. Тоесть нужно будет включить бит допустим на 20-ой микросекунде и погасить его на 78-ой микросекунде.Потом перейти к следующему значению из таблицы синуса и выставить другую точку включения бита.

Это полноценный режим Fast PWM. Примерно вот такие вот у меня рассуждения. Может ктото чтото добавит?

Добавлено: Сб апр 25, 2009 07:37:48
SeamaNCOS
Надеюсь я все понял правильно то вот весь проект :)
(11code.asm с appnote в протеусе измените на этот)

Добавлено: Сб апр 25, 2009 11:58:40
snayperAlfa
Спасибо за проект. Теперь попробую добится от сигнала формы, похожую на синус. Как я понял, то в прерывании таймера увеличивается temp2 на 1. А разве не будет такого что у регистра сравнения макс. значение 37, а у temp2 будет > 37?
Если не тяжело,то не могли бы вы сдесь привестисловесный алгоритм.

Похоже тут грузится число temp2 сразу в весь порт.

Добавлено: Сб апр 25, 2009 12:28:53
SeamaNCOS
temp2 увеличиваеться от 1 до 256(0) и оно влеяет только на порт B0 и все :)
На счет алгоритма в исходнике же есть коментарии.
Программа элементарная.
Reset настраиваем таимер, его такт, число сравнения, порт b
Cycle постоянный цикл при котором выводится значение в порт B

ну и прерывание по совподению числа сравнения в котором увеличиваеться temp2 и обнуляется таимер(хотя он вроде как обнуляеться сразу при совподении :) )

Добавлено: Сб апр 25, 2009 12:55:03
snayperAlfa
Вот это синус :shock: :shock: ! Класс.
Вот только индуктивность...
Ладно чтото придумаю. Огромное спасибо за помощь в решении задачи. :)) :))

Добавлено: Сб апр 25, 2009 13:30:28
snayperAlfa
temp2 все таки влияет на PB0...PB4

out PortB,temp2 ;вывод в порт

Тю! ldi Temp1,0b00000001
Остальные выводы ведь на вход работают :)

Добавлено: Вс апр 26, 2009 03:08:44
SeamaNCOS
Ну если не надо чтоб влеяли надо в прерывании сравнивать temp2 с 1 и если 1 то обнулять. А вообще можно порты настроить чтоб только B0 работал.