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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Сообщения: 58
Зарегистрирован: Ср июл 09, 2008 22:17:41

Сообщение 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
Симуляция в Протеусе и прошивка
Вложения
485 kHz.rar
(11.89 КБ) 258 скачиваний
Последний раз редактировалось snayperAlfa Пт апр 24, 2009 19:44:20, всего редактировалось 1 раз.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Ничего не понял...
Как связаны генератор на 485 кГц и синус 100 Гц?
Они как-то друг на друга влияют? Или 485 кГц тактуют тиньку?
Нужен делитель?
Today fine night...
Реклама
Открыл глаза
Сообщения: 58
Зарегистрирован: Ср июл 09, 2008 22:17:41

Сообщение snayperAlfa »

485 кГц тактуют Тини. На выходе OCOA стоит фильтр который самопальный ШИМ преобразует в синус.

Надо сделать: на выходе получить положительные полуволны синуса частотой 100 Гц.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

исправьте код так, чтобы влез целиком на дисплей без горизонтальной прокрутки!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср дек 10, 2008 15:10:59
Откуда: KPACHO9PCK

Сообщение SeamaNCOS »

Короче говоря надо в тиньке13 разделить сигнал с частотой 485 кГц на 4850 и выдать на порт А (с частотой 100Гц) я привильно сформулировал задачу?

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

В си неселен (вообще не понимаю) а в асме написал бы за несколько минут такую прогу (какая пошрешность преобразования допустима для сигнала на порте А при стабильном тактировании 485 кГц )
Чем больше думаеш, тем дольше уснуть не можеш...
Контактная информация:
Реклама
Открыл глаза
Сообщения: 58
Зарегистрирован: Ср июл 09, 2008 22:17:41

Сообщение 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. Примерно вот такие вот у меня рассуждения. Может ктото чтото добавит?
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср дек 10, 2008 15:10:59
Откуда: KPACHO9PCK

Сообщение SeamaNCOS »

Надеюсь я все понял правильно то вот весь проект :)
(11code.asm с appnote в протеусе измените на этот)
Вложения
11code.asm
(8.41 КБ) 548 скачиваний
attiny13.zip
(34.04 КБ) 223 скачивания
Чем больше думаеш, тем дольше уснуть не можеш...
Контактная информация:
Открыл глаза
Сообщения: 58
Зарегистрирован: Ср июл 09, 2008 22:17:41

Сообщение snayperAlfa »

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

Похоже тут грузится число temp2 сразу в весь порт.
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср дек 10, 2008 15:10:59
Откуда: KPACHO9PCK

Сообщение SeamaNCOS »

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

ну и прерывание по совподению числа сравнения в котором увеличиваеться temp2 и обнуляется таимер(хотя он вроде как обнуляеться сразу при совподении :) )
Вложения
attiny13 SIN.zip
вот и готовый SIN
(44.82 КБ) 281 скачивание
Чем больше думаеш, тем дольше уснуть не можеш...
Контактная информация:
Открыл глаза
Сообщения: 58
Зарегистрирован: Ср июл 09, 2008 22:17:41

Сообщение snayperAlfa »

Вот это синус :shock: :shock: ! Класс.
Вот только индуктивность...
Ладно чтото придумаю. Огромное спасибо за помощь в решении задачи. :)) :))
Открыл глаза
Сообщения: 58
Зарегистрирован: Ср июл 09, 2008 22:17:41

Сообщение snayperAlfa »

temp2 все таки влияет на PB0...PB4

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

Тю! ldi Temp1,0b00000001
Остальные выводы ведь на вход работают :)
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср дек 10, 2008 15:10:59
Откуда: KPACHO9PCK

Сообщение SeamaNCOS »

Ну если не надо чтоб влеяли надо в прерывании сравнивать temp2 с 1 и если 1 то обнулять. А вообще можно порты настроить чтоб только B0 работал.
Чем больше думаеш, тем дольше уснуть не можеш...
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»