Полная версия этой страницы:
Автоподстройка на скважности.
Ребята, подскажите? Делаю автоподстройку нуля. А опыта мало совсем. Сигнал автоподстройки берётся с фильтра на ОУ, а на сам фильтр идёт прямоугольный сигнал с переменной скважностью, частотой 120-200 гц. Скважность меняется во времени уменьшаясь или увеличиваясь, в зависимости от состояния компаратора, который подключен к выходу усилителя на ОУ ( Ку-30), а на вход подается сигнал автоподстройки с фильтра, подмешанный к некоторому входному сигналу. Когда на выходе "0", сигнал близок к меандру. И т.д...
Как бы покрасивее всё это оформить програмно? Контроллер Тини-15, ИАР отказался с ним на СИ работать, придётся наверное Асм поднимать. Поделитесь пожалуйста кто что думает? Спасибо.
Dog Pawlowa
Oct 18 2007, 16:43
Цитата(Коляй @ Oct 18 2007, 16:14)

Поделитесь пожалуйста кто что думает?
Я вот думаю, как бы здорово было поесть и выпить.
И пусть только кто меня обвинит в оффтопике!
Из описанного понял, что микроконтроллер притянут за уши. Шоб был!
Цитата(Dog Pawlowa @ Oct 18 2007, 20:43)

Из описанного понял, что микроконтроллер притянут за уши. Шоб был!
А вы попробуйте повешайте интеграторов с резисторами по 20 Мом, вот тогда и скажете своё имхо!
Задача хитрая. Там в обычном режиме значение подстройки меняется примерно раз в секунду. При подаче питания большая скорость переходит на "раз в секунду" примерно за 5-8 секунд. Потом ещё если сигнал в плюс идёт, то "раз в секунду", если в минус - сначала быстро, с переходом на "раз в секунду" по экспоненте желательно. Так что ещё АЦП придётся задействовать. Изначально эта схема сделана на логике, но подстройка получается больше самого аппарата (по корпусам МС). Так что шоб был или не был позвольте уж мне решать.
И вобще вопрос не стоял про целесообразность применения МК. Чего флудить то?
Dog Pawlowa
Oct 19 2007, 07:20
Цитата(Коляй @ Oct 18 2007, 21:46)

...
И вобще вопрос не стоял про целесообразность применения МК. Чего флудить то?
Поверьте, у меня есть некоторый опыт применения и МК, и интеграторов в десятками мегаом, но я не понял, какой вопрос вообще стоял. И другие видимо тоже, раз не пишут ничего.
Обвинять во флуде единственного ответившего, конечно же, Ваше право, но стоит немного и призадуматься о качестве и внятности формулировки вопросов.
Успехов
sseett
Oct 19 2007, 07:28
> Контроллер Тини-15, ИАР отказался с ним на СИ работать, придётся наверное Асм поднимать
Эту проблему решит Тини25-45-85
мона и на тини13,она дешевше.
Цитата(Коляй @ Oct 18 2007, 17:14)

Ребята, подскажите? Делаю автоподстройку нуля. А опыта мало совсем. Сигнал автоподстройки берётся с фильтра на ОУ, а на сам фильтр идёт прямоугольный сигнал с переменной скважностью, частотой 120-200 гц. Скважность меняется во времени уменьшаясь или увеличиваясь, в зависимости от состояния компаратора, который подключен к выходу усилителя на ОУ ( Ку-30), а на вход подается сигнал автоподстройки с фильтра, подмешанный к некоторому входному сигналу. Когда на выходе "0", сигнал близок к меандру. И т.д...
Как бы покрасивее всё это оформить програмно? Контроллер Тини-15, ИАР отказался с ним на СИ работать, придётся наверное Асм поднимать. Поделитесь пожалуйста кто что думает? Спасибо.
Чето вопрос правда не совсем понятен:-/ я так понимаю Вам необходимо анализировать входной сигнал с переменной скважностью, собственно определять скважность? и выводить (куда то?!) значение? так? Ну дык по прерываню с порта "смотрите" первый интервал, потом второй сравниваете, и вперед.. получаете отношение. Далее что угодно с ним и делайте. В чем собственно проблема? :-?
Спасибо. Немного не так спросил. Необходимо наоборот регулировать скважность в импульсах частотой 120-200 гц. Нужно импульсы сделать что б скважность в широких пределах регулировалась одной переменной, хотя бы в 8 бит для начала. Хотелось бы спросить как пограмотнее сделать. Спасибо.
Maik-vs
Oct 19 2007, 10:00
Цитата(Коляй @ Oct 19 2007, 13:44)

Спасибо. Немного не так спросил. Необходимо наоборот регулировать скважность в импульсах частотой 120-200 гц. Нужно импульсы сделать что б скважность в широких пределах регулировалась одной переменной, хотя бы в 8 бит для начала. Хотелось бы спросить как пограмотнее сделать. Спасибо.
Так ШИМом же. Счётчик таймера считает то 0 до 255. Его значение сравнивается с регистром сравнения (специально есть такой в таймере). Записали в регистр 127 - получили меандр, записали 1 - 1/256-ю преиода. Всё это происжодит независимо от процессора, нужно только организовать частоту счёта, вид сравнения и разрешить вывод на ногу процессора. В даташите всё подробненько описано; В TINY15 всё есть. А вот откуда возьмётся значение ШИМа? Вычислится из аналоговой величины рассогласования?
Цитата(Maik-vs @ Oct 19 2007, 14:00)

Так ШИМом же. Счётчик таймера считает то 0 до 255. Его значение сравнивается с регистром сравнения (специально есть такой в таймере). Записали в регистр 127 - получили меандр, записали 1 - 1/256-ю преиода. Всё это происжодит независимо от процессора, нужно только организовать частоту счёта, вид сравнения и разрешить вывод на ногу процессора. В даташите всё подробненько описано; В TINY15 всё есть. А вот откуда возьмётся значение ШИМа? Вычислится из аналоговой величины рассогласования?
Угу, спасибо. Пока временно сделал без ШИМа, но если удобнее, то сделаю ШИМ. В ИАРе пока Тини-13 выбрал. Ну а скорости изменений потом буду подгонять. Тини-15 просто есть одна, а так бы конечно не связывался без ОЗУ.
Таймерами пользовался, в ШИМ не хотелось лезть. А он оказывается для этих целей и сделан. Немного прочитал, зарядил регистры (на асме) и сразу почти заработало (вывод только пришлось немного сконфигурировать), даже частота правильная получилась. Ну дальше уже дело техники. Спасибо всем большое.
Чего боялся на то и напоролся. Оказывается мало 8 бит для ШИМа. Там сделано частота 120 гц и дискретность ШИМа 2 мкс. Это получается нужен 12-и разрядный ШИМ. Если программно сделать, то проц будет только ШИМ-ом одним заниматься и больше ни чем. Что же, Мегу опять придётся применять?
(ещё делал это дело на 572ПА1, ЦАП 10-разрядный + реверс.счетчики, вобще плохо получилось, мало дискретности было, сигнал на выходе дрыгался прилично).
mdmitry
Oct 21 2007, 12:31
Может радикально пересмотреть ситуацию и выбрать другой контроллер? У Freescale есть контроллеры специально для управления двигателями с хорошими ШИМ.
Цитата(mdmitry @ Oct 21 2007, 16:31)

Может радикально пересмотреть ситуацию и выбрать другой контроллер? У Freescale есть контроллеры специально для управления двигателями с хорошими ШИМ.
А придётся. Хошь не хошь. В наличии есть Мега8535, Тиньки2313, и Тиня-15. Придётся на Меге делать, но тогда и остальное надо ей поручать, ЖК цеплять, кнопки, меню... не одной же автоподстройкой ей заниматься. Опять новый прибор получается вместо доработки. Делаю металлоискатель.
Спасибо всем.
Цитата(Коляй @ Oct 21 2007, 18:52)

В наличии есть Мега8535, Тиньки2313, и Тиня-15. Придётся на Меге делать, но тогда и остальное надо ей поручать, ЖК цеплять, кнопки, меню... не одной же автоподстройкой ей заниматься. Опять новый прибор получается вместо доработки.
Обратите внимание на 8-ногие ATtiny25/45/85, у них есть внутренняя ПЛЛ, вырабатывает 64 МГц, предназначенные как раз для быстрого шим.
Что касается тайни15, то внутри прибора с помощью ПЛЛ можно получить 25 МГц...
Maik-vs
Oct 22 2007, 13:08
Цитата(Коляй @ Oct 21 2007, 09:05)

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

Косяков не видно... прогнал дебаггером в AvrStudio 4.13.555 sp1. Всё работает. При 4 мегагерцах прерывания через 64 мкс, на порту выскакивает импульс длиной 32 мкс через 1024 мкс. Кстати, SREG в прерывании TIMER1_COMP можно не запоминать: команда sbi не изменяет флаги.
Спасибо. Надо в железе наверное уже делать, вернее будет. Прерывание придётся ещё немного дописАть потом, так что SREG пригодится.
Всё, хватит! Кончилось терпение! Поеду 13-ю Тиню покупать, вроде в магазине ещё пара штук осталась. Достало уже это убожество без ОЗУ (15-я). А 13-я и в Протеусе заработала, я привык уже к нему. Хотелось бы только спросить, а как на СИ из переменной unsigned int младший байт куда-нить отправить, хотя бы в порт в IAR-е?
Цитата(Коляй @ Nov 3 2007, 23:26)

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

Вопрос снялся. ИАР сам отправил младший байт куда надо. Когда потребовалось сравнить старший байт с 8-разрядным числом, я сделал сдвиг вправо на 8 бит, думал компилятор наставит 8 lsr - ов. А ИАР сам всё сделал грамонто, использовав только старший байт. Спасибо всем за советы.
Можно макро использовать
#define LOBYTE(x) (uint8_t(x))
#define HIBYTE(x) (uint8_t(x>>8))
Ребята, посмотрите пожалуйста код? Не работает как положено. Вобщем хорошо скважность меняется, но доходит до определённых мест и останавливается на 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;
}
}
Или наоборот дальше от нуля отходить...
(чего то правки сообщения не нашол)
Коляй, это ваш сайт
kolyay.narod.ru ?
Если интересно - гляньте мой сайт
metadec.narod.ruТам пара приборов, многочастотных. В каждом задействованы все аппаратные ШИМы, есть 4 вспомогательных программных по 5 бит и два 10 битных для баланса.
Вы уверены, что Вам хватит Тиньки? Лучше сразу заложитесь полнее - Мега нынче копейки стоит...
"Изюминка" этих приборов в том, что работают они с любыми датчиками, сбалансированными как угодно :-)- при изготовлении достаточно получить вых.напряжение в пределах 500мВ и любой фазовый сдвиг. Если же применен датчик с единственной обмоткой - даже этого не надо. Еще можно мгновенно менять датчики, работающие на чатотах от 2 до 20кГц.
Ну, остальное на сайте...
Удачи
Блин, хотел смайлик вставить - не получилось... Видно, сложное это дело.
Ну "сайт" это конечно громко сказано, скорее так просто пара схемок. А на ваш обязательно щас загляну. Тиньки хватит, она только подстройкой занимается. Неохота для этого Мегу заряжать, хотя в наличии есть.
Проблема решилась. Пришлось разделить переменную int на две однобайтовые и ту которая загружается в OCR0A ограничить, что не была менее 0х20 к примеру. Теперь нормально всё идёт. Спасибо всем.
Цитата(Коляй @ Nov 18 2007, 19:18)

Проблема решилась. Пришлось разделить переменную int на две однобайтовые и ту которая загружается в OCR0A ограничить, что не была менее 0х20 к примеру. Теперь нормально всё идёт. Спасибо всем.
А верное ли это решение? Я бы не стал привязываться к каким-либо конкретным значениям. САР не должна иметь мертвых зон, скважность должна устанавливаться автоматически при балансировке. 0х20 это сегодня - а завтра изменилась температура,... чихнули не вовремя - и нужно записывать 0х40?
Мне кажется - где-то недоработка...
Так и не удалось добиться нормальной работы программного ШИМ-а. Дрыгается всё равно. В мрограммировании ещё не очень разбираюсь, по этому поступил проще. В Тини_13 есть 2 ШИМа, вот и сделал старший байт в один, младший - в другой. Всё пока отлично в симуляторах, завтра в железе попробую. На выходах перед фильтром простой резистивный сумматор. R + R*16 или на 15. Вобщем видимо потребуется тчательный подбор резисторов, и два выходных ключа видимо лучше в одном корпусе взять, но это уже не беда. Спасибо.
Упс, ошибочка. Не R*15, a R*(2^15)
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.