|
Автоподстройка на скважности., На контроллере Тини-15. |
|
|
|
Oct 18 2007, 13:14
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

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

|
Цитата(Коляй @ Oct 18 2007, 16:14)  Поделитесь пожалуйста кто что думает? Я вот думаю, как бы здорово было поесть и выпить. И пусть только кто меня обвинит в оффтопике! Из описанного понял, что микроконтроллер притянут за уши. Шоб был!
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 18 2007, 18:46
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

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

|
Цитата(Коляй @ Oct 18 2007, 21:46)  ... И вобще вопрос не стоял про целесообразность применения МК. Чего флудить то? Поверьте, у меня есть некоторый опыт применения и МК, и интеграторов в десятками мегаом, но я не понял, какой вопрос вообще стоял. И другие видимо тоже, раз не пишут ничего. Обвинять во флуде единственного ответившего, конечно же, Ваше право, но стоит немного и призадуматься о качестве и внятности формулировки вопросов. Успехов
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 19 2007, 08:13
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата(Коляй @ Oct 18 2007, 17:14)  Ребята, подскажите? Делаю автоподстройку нуля. А опыта мало совсем. Сигнал автоподстройки берётся с фильтра на ОУ, а на сам фильтр идёт прямоугольный сигнал с переменной скважностью, частотой 120-200 гц. Скважность меняется во времени уменьшаясь или увеличиваясь, в зависимости от состояния компаратора, который подключен к выходу усилителя на ОУ ( Ку-30), а на вход подается сигнал автоподстройки с фильтра, подмешанный к некоторому входному сигналу. Когда на выходе "0", сигнал близок к меандру. И т.д... Как бы покрасивее всё это оформить програмно? Контроллер Тини-15, ИАР отказался с ним на СИ работать, придётся наверное Асм поднимать. Поделитесь пожалуйста кто что думает? Спасибо. Чето вопрос правда не совсем понятен:-/ я так понимаю Вам необходимо анализировать входной сигнал с переменной скважностью, собственно определять скважность? и выводить (куда то?!) значение? так? Ну дык по прерываню с порта "смотрите" первый интервал, потом второй сравниваете, и вперед.. получаете отношение. Далее что угодно с ним и делайте. В чем собственно проблема? :-?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 19 2007, 10:00
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Коляй @ Oct 19 2007, 13:44)  Спасибо. Немного не так спросил. Необходимо наоборот регулировать скважность в импульсах частотой 120-200 гц. Нужно импульсы сделать что б скважность в широких пределах регулировалась одной переменной, хотя бы в 8 бит для начала. Хотелось бы спросить как пограмотнее сделать. Спасибо. Так ШИМом же. Счётчик таймера считает то 0 до 255. Его значение сравнивается с регистром сравнения (специально есть такой в таймере). Записали в регистр 127 - получили меандр, записали 1 - 1/256-ю преиода. Всё это происжодит независимо от процессора, нужно только организовать частоту счёта, вид сравнения и разрешить вывод на ногу процессора. В даташите всё подробненько описано; В TINY15 всё есть. А вот откуда возьмётся значение ШИМа? Вычислится из аналоговой величины рассогласования?
|
|
|
|
|
Oct 19 2007, 13:25
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

|
Цитата(Maik-vs @ Oct 19 2007, 14:00)  Так ШИМом же. Счётчик таймера считает то 0 до 255. Его значение сравнивается с регистром сравнения (специально есть такой в таймере). Записали в регистр 127 - получили меандр, записали 1 - 1/256-ю преиода. Всё это происжодит независимо от процессора, нужно только организовать частоту счёта, вид сравнения и разрешить вывод на ногу процессора. В даташите всё подробненько описано; В TINY15 всё есть. А вот откуда возьмётся значение ШИМа? Вычислится из аналоговой величины рассогласования? Угу, спасибо. Пока временно сделал без ШИМа, но если удобнее, то сделаю ШИМ. В ИАРе пока Тини-13 выбрал. Ну а скорости изменений потом буду подгонять. Тини-15 просто есть одна, а так бы конечно не связывался без ОЗУ.
|
|
|
|
|
Oct 21 2007, 18:52
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

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

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Коляй @ Oct 21 2007, 18:52)  В наличии есть Мега8535, Тиньки2313, и Тиня-15. Придётся на Меге делать, но тогда и остальное надо ей поручать, ЖК цеплять, кнопки, меню... не одной же автоподстройкой ей заниматься. Опять новый прибор получается вместо доработки. Обратите внимание на 8-ногие ATtiny25/45/85, у них есть внутренняя ПЛЛ, вырабатывает 64 МГц, предназначенные как раз для быстрого шим. Что касается тайни15, то внутри прибора с помощью ПЛЛ можно получить 25 МГц...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
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? Мне кажется - где-то недоработка...
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|