|
Автоподстройка на скважности., На контроллере Тини-15. |
|
|
|
Oct 22 2007, 13:08
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Коляй @ Oct 21 2007, 09:05)  Чего боялся на то и напоролся. Оказывается мало 8 бит для ШИМа. Там сделано частота 120 гц и дискретность ШИМа 2 мкс. Это получается нужен 12-и разрядный ШИМ. Если программно сделать, то проц будет только ШИМ-ом одним заниматься и больше ни чем. Что же, Мегу опять придётся применять? (ещё делал это дело на 572ПА1, ЦАП 10-разрядный + реверс.счетчики, вобще плохо получилось, мало дискретности было, сигнал на выходе дрыгался прилично). Ну, Мегу - не мегу, есть и тиньки с 16-разрядными таймерами. Правда, корпус минимум 14-ногий. Можно попробовать сделать программно, разделив 12 бит на старшие 4 бита и младшие, в таймере. В прерывании по сравнению таймера сравнивать старшие биты, в прерывании переполнения таймера наращивать счётчик старших бит. Частота ШИМа получится в 16 раз меньше частоты переполнения таймера. Если для этого ресурсов не хватит, то конечно - брать контроллер с 16-разрядным таймером.
|
|
|
|
|
Oct 30 2007, 19:11
|
Частый гость
 
Группа: Участник
Сообщений: 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 ;
|
|
|
|
|
Oct 31 2007, 08:35
|
Местный
  
Группа: Участник
Сообщений: 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 не изменяет флаги.
|
|
|
|
|
Oct 31 2007, 10:22
|
Частый гость
 
Группа: Участник
Сообщений: 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 пригодится.
|
|
|
|
|
Nov 5 2007, 10:44
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

|
Цитата(Коляй @ Nov 3 2007, 23:26)  Хотелось бы только спросить, а как на СИ из переменной unsigned int младший байт куда-нить отправить, хотя бы в порт в IAR-е? Вопрос снялся. ИАР сам отправил младший байт куда надо. Когда потребовалось сравнить старший байт с 8-разрядным числом, я сделал сдвиг вправо на 8 бит, думал компилятор наставит 8 lsr - ов. А ИАР сам всё сделал грамонто, использовав только старший байт. Спасибо всем за советы.
|
|
|
|
|
Nov 5 2007, 12:07
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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))
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Nov 16 2007, 18:38
|
Частый гость
 
Группа: Участник
Сообщений: 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; } }
|
|
|
|
|
Nov 18 2007, 13:47
|
Местный
  
Группа: Свой
Сообщений: 313
Регистрация: 7-01-07
Из: Севастополь
Пользователь №: 24 170

|
Коляй, это ваш сайт kolyay.narod.ru ? Если интересно - гляньте мой сайт metadec.narod.ruТам пара приборов, многочастотных. В каждом задействованы все аппаратные ШИМы, есть 4 вспомогательных программных по 5 бит и два 10 битных для баланса. Вы уверены, что Вам хватит Тиньки? Лучше сразу заложитесь полнее - Мега нынче копейки стоит... "Изюминка" этих приборов в том, что работают они с любыми датчиками, сбалансированными как угодно :-)- при изготовлении достаточно получить вых.напряжение в пределах 500мВ и любой фазовый сдвиг. Если же применен датчик с единственной обмоткой - даже этого не надо. Еще можно мгновенно менять датчики, работающие на чатотах от 2 до 20кГц. Ну, остальное на сайте... Удачи Блин, хотел смайлик вставить - не получилось... Видно, сложное это дело.
Сообщение отредактировал IGK - Nov 18 2007, 13:50
|
|
|
|
|
Nov 19 2007, 06:09
|
Местный
  
Группа: Свой
Сообщений: 313
Регистрация: 7-01-07
Из: Севастополь
Пользователь №: 24 170

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