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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Автоподстройка на скважности., На контроллере Тини-15.
Maik-vs
сообщение Oct 22 2007, 13:08
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Коляй @ Oct 21 2007, 09:05) *
Чего боялся на то и напоролся. Оказывается мало 8 бит для ШИМа. Там сделано частота 120 гц и дискретность ШИМа 2 мкс. Это получается нужен 12-и разрядный ШИМ. Если программно сделать, то проц будет только ШИМ-ом одним заниматься и больше ни чем. Что же, Мегу опять придётся применять?
(ещё делал это дело на 572ПА1, ЦАП 10-разрядный + реверс.счетчики, вобще плохо получилось, мало дискретности было, сигнал на выходе дрыгался прилично).

Ну, Мегу - не мегу, есть и тиньки с 16-разрядными таймерами. Правда, корпус минимум 14-ногий.
Можно попробовать сделать программно, разделив 12 бит на старшие 4 бита и младшие, в таймере. В прерывании по сравнению таймера сравнивать старшие биты, в прерывании переполнения таймера наращивать счётчик старших бит. Частота ШИМа получится в 16 раз меньше частоты переполнения таймера. Если для этого ресурсов не хватит, то конечно - брать контроллер с 16-разрядным таймером.
Go to the top of the page
 
+Quote Post
Коляй
сообщение Oct 30 2007, 19:11
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Ребята, посмотрите вы пожалуйста код? Проклятый Протеус не желает ни в какую показывать сигнал, один импульс дрыгнет и всё. И прямая линия дальше. В АВР-Студии всё отлично работает, правда в 3,22 (четвёртая слетает с любого файла). Я уже делал и на разных таймерах, всё одно... Мне то дальше надо писАть, а тут в самом начале уже косяки начались. Посмотрите вы чего я накосячил? Да, в VMLAB-е работает всё, но не с первого раза. VMLAB ругается сначала 2 раза, что то про SREG (Bit1).
Цитата
.include "tn15def.inc"
; Variable Declarations
.def temp = r16
.def skwlow = r20
.def skwhigh = r21
.def freqhigh = r22
.def takt = r19
.def n = r18
.def stek = r26
.cseg ; CODE segment.

;Interrupt Vectors
.org 0
rjmp RESET ;Reset
reti ;INT 0
reti ;Pin Change
rjmp TIMER1_COMP ;Output compare
rjmp TIMER1_OVF ;Timer 1
reti ;rjmp tov0 ;Timer 0
reti ;EEPROM ready
reti ;Analog Comparator
reti ;ADC Complete

;Initialization
RESET:
ldi temp, 0 ;
out OSCCAL,temp
ldi temp, 0x07 ; port na out
out DDRB, temp ;
ldi temp, 0x44 ; prer po COMP & OVF
out TIMSK, temp ;
ldi temp, 0x80 ; test
out 0x2E, r16 ;
ldi temp, 0x05 ; clock/1
out TCCR1, temp ;
clr skwlow ;
clr freqhigh ;
ldi skwhigh, 0x04 ;test

sei ;
; ldi r16,$8E ; Enable, ADIE, Prescale = 1/64
; out ADCSR,r16
; ldi r16,0 ; Select ADC0 as input, VCC as VREF
; out ADMUX,r16

LOOP:
nop
nop
rjmp LOOP ;

TIMER1_OVF:

in stek, SREG ;
cpi freqhigh, 0x10 ;
brne dal1;
clr freqhigh ;
sbi PORTB, 2 ;
dal1:
inc freqhigh;

out SREG, stek ;
reti ;

TIMER1_COMP:

in stek, SREG ;
cbi PORTB, 2 ;
out SREG, stek ;
reti ;
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Oct 31 2007, 08:35
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Коляй @ Oct 30 2007, 23:11) *
Ребята, посмотрите вы пожалуйста код? Проклятый Протеус не желает ни в какую показывать сигнал, один импульс дрыгнет и всё. И прямая линия дальше. В АВР-Студии всё отлично работает, правда в 3,22 (четвёртая слетает с любого файла). Я уже делал и на разных таймерах, всё одно... Мне то дальше надо писАть, а тут в самом начале уже косяки начались. Посмотрите вы чего я накосячил? Да, в VMLAB-е работает всё, но не с первого раза. VMLAB ругается сначала 2 раза, что то про SREG (Bit1).


Косяков не видно... прогнал дебаггером в AvrStudio 4.13.555 sp1. Всё работает. При 4 мегагерцах прерывания через 64 мкс, на порту выскакивает импульс длиной 32 мкс через 1024 мкс. Кстати, SREG в прерывании TIMER1_COMP можно не запоминать: команда sbi не изменяет флаги.
Go to the top of the page
 
+Quote Post
Коляй
сообщение Oct 31 2007, 10:22
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Цитата(Maik-vs @ Oct 31 2007, 11:35) *
Косяков не видно... прогнал дебаггером в AvrStudio 4.13.555 sp1. Всё работает. При 4 мегагерцах прерывания через 64 мкс, на порту выскакивает импульс длиной 32 мкс через 1024 мкс. Кстати, SREG в прерывании TIMER1_COMP можно не запоминать: команда sbi не изменяет флаги.

Спасибо. Надо в железе наверное уже делать, вернее будет. Прерывание придётся ещё немного дописАть потом, так что SREG пригодится.
Go to the top of the page
 
+Quote Post
Коляй
сообщение Nov 3 2007, 20:26
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Всё, хватит! Кончилось терпение! Поеду 13-ю Тиню покупать, вроде в магазине ещё пара штук осталась. Достало уже это убожество без ОЗУ (15-я). А 13-я и в Протеусе заработала, я привык уже к нему. Хотелось бы только спросить, а как на СИ из переменной unsigned int младший байт куда-нить отправить, хотя бы в порт в IAR-е?
Go to the top of the page
 
+Quote Post
Коляй
сообщение Nov 5 2007, 10:44
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Цитата(Коляй @ Nov 3 2007, 23:26) *
Хотелось бы только спросить, а как на СИ из переменной unsigned int младший байт куда-нить отправить, хотя бы в порт в IAR-е?


Вопрос снялся. ИАР сам отправил младший байт куда надо. Когда потребовалось сравнить старший байт с 8-разрядным числом, я сделал сдвиг вправо на 8 бит, думал компилятор наставит 8 lsr - ов. А ИАР сам всё сделал грамонто, использовав только старший байт. Спасибо всем за советы.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Nov 5 2007, 12:07
Сообщение #22


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Коляй @ Nov 5 2007, 13:44) *
Вопрос снялся. ИАР сам отправил младший байт куда надо. Когда потребовалось сравнить старший байт с 8-разрядным числом, я сделал сдвиг вправо на 8 бит, думал компилятор наставит 8 lsr - ов. А ИАР сам всё сделал грамонто, использовав только старший байт. Спасибо всем за советы.

Можно макро использовать
#define LOBYTE(x) (uint8_t(x))
#define HIBYTE(x) (uint8_t(x>>8))


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Коляй
сообщение Nov 16 2007, 18:38
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Ребята, посмотрите пожалуйста код? Не работает как положено. Вобщем хорошо скважность меняется, но доходит до определённых мест и останавливается на 0,5 секунды, потом скачет вперёд, потом опять идёт плавно. Вот эти скачки то мне не к чему как раз. Весь смысл такой подстройки теряется. Наверное это происходит когда в регистр сравнения заносится число близкое к максимальному. Как бы от этого избавиться?
Код
#include <iotiny13.h>
#include <intrinsics.h>

__eeprom unsigned char raz @ 0x02;
unsigned char  adc, freq;
unsigned int skw;


void  pausa (unsigned int p)
{
  while (p)
  {
    p --;  
  }
}

void main()
{
  raz ++;
  if (raz > 0x14)
  {
    while(1)
    {}
  }
  
  /* CPU INIT */
  DDRB = 0x06;
  PORTB_Bit0 = 1;
  ADMUX = 0x22; //ADLAR. PINB_Bit4
  ADCSRA = 0xE5; // adc_on, neprerivno, clock/64, adc_start
  OCR0A= 0x80;//
  TIMSK0=0x06;//  COMP0A,  OVF0
  TCCR0B=0x01;// Start clock CK/1
  __enable_interrupt();


  while(1)
  {
    
  }
}


#pragma vector=TIM0_COMPA_vect
__interrupt void MyInterrupt (void)
{
  if (freq == (skw >> 8))
  {
    PORTB_Bit1 = 0;
    skw ++;
    OCR0A = skw;
  }
}


#pragma vector=TIM0_OVF_vect
__interrupt void MyInterrupt2 (void)
{
  freq++;
  if (freq >= 0x80)
  {
    freq = 0;
   PORTB_Bit1 = 1;
  }

}
Go to the top of the page
 
+Quote Post
Коляй
сообщение Nov 16 2007, 22:04
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Или наоборот дальше от нуля отходить...
(чего то правки сообщения не нашол)
Go to the top of the page
 
+Quote Post
IGK
сообщение Nov 18 2007, 13:47
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 7-01-07
Из: Севастополь
Пользователь №: 24 170



Коляй, это ваш сайт kolyay.narod.ru ?

Если интересно - гляньте мой сайт metadec.narod.ru
Там пара приборов, многочастотных. В каждом задействованы все аппаратные ШИМы, есть 4 вспомогательных программных по 5 бит и два 10 битных для баланса.
Вы уверены, что Вам хватит Тиньки? Лучше сразу заложитесь полнее - Мега нынче копейки стоит...
"Изюминка" этих приборов в том, что работают они с любыми датчиками, сбалансированными как угодно :-)- при изготовлении достаточно получить вых.напряжение в пределах 500мВ и любой фазовый сдвиг. Если же применен датчик с единственной обмоткой - даже этого не надо. Еще можно мгновенно менять датчики, работающие на чатотах от 2 до 20кГц.
Ну, остальное на сайте...
Удачи

Блин, хотел смайлик вставить - не получилось... Видно, сложное это дело.

Сообщение отредактировал IGK - Nov 18 2007, 13:50
Go to the top of the page
 
+Quote Post
Коляй
сообщение Nov 18 2007, 17:18
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Ну "сайт" это конечно громко сказано, скорее так просто пара схемок. А на ваш обязательно щас загляну. Тиньки хватит, она только подстройкой занимается. Неохота для этого Мегу заряжать, хотя в наличии есть.
Проблема решилась. Пришлось разделить переменную int на две однобайтовые и ту которая загружается в OCR0A ограничить, что не была менее 0х20 к примеру. Теперь нормально всё идёт. Спасибо всем.
Go to the top of the page
 
+Quote Post
IGK
сообщение Nov 19 2007, 06:09
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 7-01-07
Из: Севастополь
Пользователь №: 24 170



Цитата(Коляй @ Nov 18 2007, 19:18) *
Проблема решилась. Пришлось разделить переменную int на две однобайтовые и ту которая загружается в OCR0A ограничить, что не была менее 0х20 к примеру. Теперь нормально всё идёт. Спасибо всем.


А верное ли это решение? Я бы не стал привязываться к каким-либо конкретным значениям. САР не должна иметь мертвых зон, скважность должна устанавливаться автоматически при балансировке. 0х20 это сегодня - а завтра изменилась температура,... чихнули не вовремя - и нужно записывать 0х40?
Мне кажется - где-то недоработка...
Go to the top of the page
 
+Quote Post
Коляй
сообщение Dec 2 2007, 14:08
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Так и не удалось добиться нормальной работы программного ШИМ-а. Дрыгается всё равно. В мрограммировании ещё не очень разбираюсь, по этому поступил проще. В Тини_13 есть 2 ШИМа, вот и сделал старший байт в один, младший - в другой. Всё пока отлично в симуляторах, завтра в железе попробую. На выходах перед фильтром простой резистивный сумматор. R + R*16 или на 15. Вобщем видимо потребуется тчательный подбор резисторов, и два выходных ключа видимо лучше в одном корпусе взять, но это уже не беда. Спасибо.

Сообщение отредактировал Коляй - Dec 2 2007, 14:09
Go to the top of the page
 
+Quote Post
Коляй
сообщение Dec 4 2007, 14:45
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558



Упс, ошибочка. Не R*15, a R*(2^15)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 08:14
Рейтинг@Mail.ru


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