|
|
|
15047 71 5 0 |
|
Опции темы | Поиск в этой теме |
04.10.2013, 12:02 | 41 | |||
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Цитата:
1. Ограниченный ресурс. Гарантируют 100 000 циклов записи, а дальше как повезёт. EEPROM технически является Flash памятью и имеет стандартную для Flash болячку - заряд при стирании полностью удалить не удаётся, и со временем он накапливается до критического уровня, что делает невозможным стирание. 2. Процедура записи весьма геморройная. Мало того что требуется произвести запись в 3 регистра ввода/вывода, так ещё и необходимо запустить процедуру записи хитрой комбинацией действий, которая придумана для защиты от случайной записи мусора когда МК колбасит из-за сорвавшегося тактирования или низкого напряжения питания... 3. Процесс записи длится 3,6мс. Это очень долго, и всё это время придётся ждать, прежде чем EEPROM освободится для чтения или записи следующего байта. Так вот я к чему. Возможно Вы имели ввиду использование ОЗУ? Или имеется ввиду запись с целью прочитать программатором и посмотреть? А что это даст? Смещение в каждом чипе индивидуальное и плавает в зависимости от кучи факторов (питание, температура и т.п.), в том числе и долговременных (возраст чипа и т.п.). Аналоговая схемотехника неидеальная, со слабыми сигналами всегда так. Программа должна просто самостоятельно его вычитать и обновлять при первой возможности (при каждой загрузке, или включении). Знать его необязательно. А если не планируется работать с большим диапазоном токов, то на калибровку вообще можно забить. Пара десятков LSB погоды не сыграет. Цитата:
Языки программирования "высокого" уровня по умолчанию используют такое представление чисел, так что в биполярном режиме АЦП даже более "родные" числа выдаёт, и особо заморачиваться с этими знаками и работой с ними не приходится. Цитата:
[Исправлено: INFERION, 04.10.2013 в 12:11] |
|||
Поблагодарили: 1 раз |
Mishany (04.10.2013)
|
05.10.2013, 01:23 | 42 |
В глаз сначала лазером!
Регистрация: 04.09.2012 Последняя активность: 13.03.2023 01:47 Адрес: Рай
Сообщений: 1819
Сказал(а) спасибо: 118
Поблагодарили: 118 раз(а) в 106 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Вот смотрю я и хочу вставить свои 3 копейки! Да я еще не делал программных DC-DC (скоро попробую) но вот пара вещей которых я не пойму. 1 почему АЦП должен так шуметь если он так не шумит? 2 какие проблемы с дифференциальным усилителем я не замечал особых погрешностей и даже при 50мВ на токосенсоре в стабы напруги выдают отличную стабильность тока. Но а зачем такие низкие пороги на токосенсоре в 10мВ или еще может до 1 дойдём. Плохо что у меня нет осциллографа придётся тыкать в слепую но думаю что нить получится.
Мне кажется много хотите просто от 10бит АЦП регулировку в хз каких пределах и это это на ДД АЦП. Я бы ограничился 300-500% и всё обошлось бы гемора. Я при измернии напруги сделал усреднение до 10 измерений но из-за того что это не давало не каких результатов отказался, как разница в показаниях отсутствовала, правда тут аналоговая часть питалась от претензионного малошумящего стаба, в БП измерение тока нарузки идёт до 0, то есть значения 1, 2, 3 стоят не прыгают. [Исправлено: Разряд, 05.10.2013 в 01:28] |
05.10.2013, 02:48 | 43 | ||
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
АЦП должен шуметь, если ему создать условия. В режиме ADC Noise Reduction он действительно не шумит, но ведь кроме измерения у МК и другой работы хватает. И когда её делать, если даже дышать нельзя? И вот интересное явление тут и проявляется - без шума передискретизация не работает и результат становится хуже. Мы получаем 10 бит вместо 16-ти, к примеру, как бы не старались. Да ещё и куча плясок с бубном вокруг тишины, чтоб не дай бог АЦП не соскочил на соседнюю ступеньку из-за шума. Я считаю что делать критичные к шуму механизмы вместо того, чтоб этот шум использовать - как минимум неэффективно и сложно (бороться с шумом мне часто сложнее, чем заставить его работать на себя). Может я и предвзято отношусь к этому делу после опытов с цифровым звуком. Слух наглядно продемонстрировал разницу в подходах. Сейчас попробую откопать старый проект и сгенерировать пару файликов. В обоих 8 бит звук закодировать, но один с простым отсечением младших разрядов, а другой с эффективной передискретизацией.
Цитата:
Я выше написал что все эти моменты необязательны, если требуется получить какой-то конкретный ток и всё. На 50мВ АЦП и так удовлетворительно работать будет, без особых заморочек. Цитата:
[Исправлено: INFERION, 05.10.2013 в 02:56] |
||
05.10.2013, 05:10 | 44 |
В глаз сначала лазером!
Регистрация: 04.09.2012 Последняя активность: 13.03.2023 01:47 Адрес: Рай
Сообщений: 1819
Сказал(а) спасибо: 118
Поблагодарили: 118 раз(а) в 106 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
У но вот тогда ясно. 70дБ да но тут ноу коментс. Но я вообще мне точные измерения далеки, я не когда не ставил задачу мерить точнее пусть даже 10мВ в таких вещах.
Да надо попробовать увеличить разрядность посмотрю на результаты спс за подсказку. Да я стараюсь избегать использование чего на пределе. Но с цифровым звуком на таком уровне я дела не имел конечно, после компрессии на -70дБ и НА 16Бит ЦАП аудио звучит отлично. Не я не чего там не торможу как задачи выполняются постоянно, да у меня там 200Гц АЦП работает в режиме одиночного измерения наверное из-за этого я такой результат получил. А про аудио с 8бит я аудио конвертировал и но да шум ясно дело улучшает качество. [Исправлено: Разряд, 05.10.2013 в 05:16] |
05.10.2013, 17:22 | 45 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
а 85 тиньке оказывается два шима один обычный и второй скоростной (тот что мне нужен) со своими регистрами, даташит скоро в ночных кашмарах будет сниться....
|
05.10.2013, 17:42 | 46 |
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Технически ШИМ один. Просто 1-й таймер можно тактировать частотой в 64МГц через PLL (ФАПЧ). У этого таймера 2 компаратора, которые можно подключить к выводам МК. Т.е. 2 канала ШИМ с одного таймера. Более того - эти компараторы подключены к пинам через генераторы мёртвого времени и имеют комплементарный выход (по 2 вывода на канал). У 0-го таймера тоже вроде бы что-то есть, но из-за его ущербности я его использую только как системный, для обеспечения работы внутренней требухи (АЦП, программы, и т.п.). Т.е. достаточно просто правильно настроить 1-й таймер. PLL запускается специальной процедурой, ему необходимо время для захвата частоты и её стабилизации. Процедура описана в даташите, регистр PLLCSR. Сам таймер запускается настройкой предделителя его тактовой частоты в регистре TCCR1, там же настраивается и тип выхода ШИМ, да и всё вроде. Если это кажется сложным, тогда вот:
[Исправлено: INFERION, 05.10.2013 в 18:04] |
06.10.2013, 21:00 | 47 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Понял для себя, что с нуля мне не позубам программа, нашел простую понижайку с исходником написанную в codevision под 25 тини, попробую повторить на аврстудио для 85, код вроде почти понятен, нашел процедуру запуска PLL, буду пробовать...
|
12.10.2013, 20:56 | 48 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Пока вот что получилось, даже компилируется без ошибок, в протеусе ругается на загрузку CPU
Код:
#include <avr/io.h> #include <avr/interrupt.h> unsigned int adc_counter,current; volatile unsigned long current_value; ISR(ADC_vect) { ADCSRA = 0; // Выключаем АЦП current_value = current_value + ADC; // Суммируем измеренные значения тока и помещаем в буфер adc_counter++; // Увеличиваем счетчик выборок АЦП на 1 ADCSRA=0b11111111;// Включаем АЦП } int main(void) { PORTB=0b00000000; DDRB=0b00011000; ADMUX=0b10000111; //Vref=1,1V, Ku=20, PB4+/PB3- ADCSRA=0b11111111; //pre=128, ADCSRB=0b00100000; //unipolare mode DIDR0=0b00100100; //ADC2,ADC3 enable sei(); //запуск PLL PLLCSR=0x00; PLLCSR=0b00000010; while ((PLLCSR & 1)==0); PLLCSR|=0b00000100; OCR1C=255; // PWM in min OCR1A=0x00; OCR1B=0x00; GTCCR=0x00; TCCR1=0b01100001; while(1)// вычисляем среднее значение АЦП { if (adc_counter > 10) { ADCSRA = 0; // Выключаем АЦП current = (current_value/adc_counter); adc_counter = 0; // Обнуляем счетчик выборок АЦП current_value = 0; // Обнуляем буфер значений тока //резистор 0,01 Ом, ток 2,6 А, сл-но падение на шунте 26мВ //т.к. Ku=20, URef=1,1V на ацп придет 520 мВ и это есть значение ADC равное 484 if (current>486) {OCR1C++} if (current<484) {OCR1C--;} else {OCR1C++;} ADCSRA=0b11111111;// Включаем АЦП } } } [Исправлено: Mishany, 12.10.2013 в 21:31] |
14.10.2013, 21:45 | 49 | |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Цитата:
Мне необходимо стабилизировать ток, который зависит только от напряжения на шунте и сопротивления самого шунта, а остальное уже не важно. I=U/R |
|
22.10.2013, 21:47 | 50 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
добил программу
1. пришлось использовать внешний ОУ в дифференциальном включении с Ku=30 и использовать один канал АЦП в обычном режиме. если есть предложения в улучшении алгоритма стабилизации с радостью выслушаю. [Исправлено: Mishany, 22.10.2013 в 21:53] |
23.10.2013, 16:30 | 51 |
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Я тут почти ничего не вижу. В смысле программа пустая. Нет ничего, а то что есть - примитивное. Зачем делить current_value? Не лучше ли складывать необходимое количество семплов и использовать их без ошибкогенеирующей и ресурсожрущей операции? В норме складывать вообще ничего ненужно, а на ходу обсчитывать каждый семпл. Регулятор сам всё проинтегрирует, но сделает это гораздо быстрее и аккуратнее. ШИМ тупо инкрементируется или декрементируется по факту "больше/меньше", никакой зависимости скорости от значения ошибки. Где защиты от перегрева, перегрузок? ОС медленная, что будет, если я замкну выход? Но в целом это то, с чего обычно все и начинают. Я неоднократно видел именно такой механизм.
[Исправлено: INFERION, 23.10.2013 в 16:31] |
23.10.2013, 16:37 | 52 |
Завсегдатай Фонарёвки
Регистрация: 22.09.2013 Последняя активность: 14.06.2022 22:39 Адрес: Vienna
Сообщений: 918
Сказал(а) спасибо: 126
Поблагодарили: 322 раз(а) в 166 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
INFERION, ну ведь это же и есть решение в лоб.
Светит? Светит! Пользователь рад? Рад! Так что начало положено. перечитал код, в этом месте аж передернуло. А ведь и мне (и другим начинающем программистам драйверов) было бы интересно почитать, что не забыть сделать, и как это стоит делать (те же защиты, или умные регуляторы..) |
Поблагодарили: 1 раз |
Mishany (23.10.2013)
|
23.10.2013, 16:59 | 53 |
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Самым нормальным на мой взгляд регулятором тут является ПИД. К тому же существуют готовые библиотеки. Жрут порядка 800 тактов, 16-ти разрядные. Я конечно свои предпочитаю, жрущие 50...100 тактов, но они ассемблерные. Для реализации защит требуется для начала научится нормально мультиплексировать АЦП на ходу - переходные процессы будут мешать, для каждого варианта переключения требуется своё минимальное количество пропущенных семплов. К примеру при переключении каналов нужно один семпл пропустить, или больше, если источник сигнала высокоомный. А вот если ИОН переключается, то тут уже жопа. 1,1V тупит где-то 0,2мс, VCC в 2 раза дольше. Дифференциальный усилитель трудно заставить нормально работать, но возможно. Он кстати тоже тормоз... Чтоб хватило разрешения родного АЦП - желательно научится использовать передискретизацию:
http://chipenable.ru/index.... http://chipenable.ru/index.... Ну и самое главное тут - скорость. Защиты должны работать достаточно быстро, регулятор тока тем более. В повышалке может пригодится защита от перенапряжения на выходе. Можно влепить делитель напряжения, а можно и матаном вопрос этот кое как решить, сэкономив лапу МК. |
Поблагодарили: 1 раз |
Maksoff (23.10.2013)
|
23.10.2013, 23:24 | 54 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
возникла идея немного другого алгоритма
предположим ADCH для выбранного тока будет равным 100 (значение напряжения на шунте) начальная установка для шим OCR1A = 10 тогда регулировка сводится к одному выражению: OCR1ACR1A*100/ADCH причем происходит мгновенная реакция на изменение тока вызванного например резким увеличением питания к примеру на 5 вольт для случая как в программе ADCH=164 OCR1ACR1A*164/ADCH 1. подали питание OCR1A=10*164/15(ADCH предположим очень маленькое значение)=109 2. OCR1A=109*164/140=127 .... n. OCR1A=215(предположим)*164/164=215 для случая с неизменным входным напряжением прыгнуло напряжение питания: n+k. OCR1A=215*164/255=138 т.е. реакция на изменение пропорциональна в процентном соотношении вроде все хорошо, но чувствую есть где то подвох, который я не заметил еще. Почти ПИД Код:
#include <avr/io.h> #include <avr/interrupt.h> __attribute__((OS_main)) SIGNAL(SIG_ADC) { OCR1A=OCR1A*164/ADCH; } int main(void) { ....инициализация PWM,ADC,портов sei(); While (1) { чтото еще в перерывах между прерываниями } } [Исправлено: Mishany, 23.10.2013 в 23:56] |
24.10.2013, 05:57 | 55 |
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Пропорциональный регулятор это даже не то что не ПИД - это даже не попсовый в аналоговых стабилизаторах ПИ-регулятор...
Почитайте теорию оптимального управления где-нибудь. Или просто за налаживание ПИД-регулятора и за то, что конкретно в нём делает каждое звено. П-звено не способно нормально держать параметр, требуется интегратор ошибки. Светодиоду требуется заполнение ШИМ ровно 150, к примеру, если у нас питание 4V. Т.е. на светодиоде падает 4*150/256=2,34V. Мы подняли питание до 5V, и что сделает этот пропорциональный регулятор? Он увидит что ток подскочил и убавит его лишь на какой-то процент. Он не сведёт ошибку к минимуму, т.к. ему постоянно требуется какое-то отклонение от нормы, чтоб продолжать держать заданное заполнение. Получим резистор, а не стабилизатор. Оставшуюся ошибку должен добивать интегратор ошибки, в роли которого тут и работало инкрементирование и декрементирование ШИМ. Медленно, но выходить на рабочий режим. Причём не так тупо как в предыдущей реализации, а чем больше ошибка - тем быстрее вырулит. Выглядит это как НЧ фильтр с мощным усилителем ошибки за ним. Именно так и выглядит аналоговая ОС в стабилизаторах - ОУ с усилением в десятки-сотни тысяч, с конденсатором в цепи собственной ОС, который режет усиление на ВЧ. На резкие изменения он реагирует не слишком резво, чтоб не перерегулировать, а затем постепенно выруливает ошибку к минимуму благодаря гиганскому усилению, т.к. мизерное отклонение вызывает мощные изменения на выходе. И чем больше будет отклонение - тем быстрее начнёт выруливать. Это не матан, это в первую очередь физика, а арифметика симулирует физические процессы аналоговых процессов. И это нужно понимать. Дифференциальное же звено противоположно интегрирующему - это фильтр ВЧ, который на резкие выбросы реагирует резким изменением заполнения ШИМ, но при этом игнорирует медленные процессы и никак не мешает интегратору. В итоге передаточная характеристика получается максимально резкой и стабильной. Если её разложить в спектр - можно увидеть что как фильтр этот регулятор пропускает всю полосу, в отличии от ПИ-регулятора, являющегося фильтром НЧ и поэтому игнорирующего резкие изменения. Регулятор это в первую очередь фильтр с некой передаточной характеристикой. И не важно цифровой он или аналоговый - физика для обоих вариантов одна, и рассматривать цифру нужно так же как и аналог. Т.е. Смотреть не на циферки и всякие там арифметические операции, а на то, как он должен усиливать сигнал, резать частоту, крутить фазу и т.п. А уже потом подобрав подходящие параметры - описать их этими плюсиками, делениями и т.п. Если делать наоборот, то можно увидеть какое безобразие получается на выходе по сравнению с нормальными механизмами. [Исправлено: INFERION, 24.10.2013 в 06:24] |
Поблагодарили: 1 раз |
Maksoff (24.10.2013)
|
24.10.2013, 13:20 | 56 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Т.е. это:
OCR1ACR1A*const/ADCH где const - значение для выбранного тока стабилизации не лучше чем: Код:
while (1) { ADCSRA = 0x00; if (ADCH > const) { OCR1A--; } if (ADCH < const) { OCR1A++; } ADCSRA=0b11111101; } Возможно использование ПИД в моем случае не оправдано и работа с банальным -- и ++ не будет отличаться от работы с использованием ПИД? Возможно ли такое? (прочитал это) моя формула делает тоже самое только проще до безобразия в коде. [Исправлено: Mishany, 24.10.2013 в 13:49] |
24.10.2013, 16:19 | 57 |
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Давайте поспорим. Сначала я критикую Ваш регулятор, а затем выкладываю на "стол" свой...Действительно. Я не обратил внимание что каждый раз берётся уже модифицированное значение OCR1A, а это уже не пропорциональный регулятор, а пропорционально-интегральный. Ошибка накапливается и через некоторое время система входит в равновесие, когда опорное значение равно показаниям АЦП. Это если параметры окажутся устойчивыми, т.к. тут не предусмотрен механизм их регулировки. Давайте посмотрим допустимо ли тут усиление пропорциональной составляющей? С обычной нагрузкой и в обычной схеме ток будет меняться где-то на 4% с каждым LSB в OCR1A на максимальных (наименее устойчивых) токах.
П-звено реагирует шустро, однако только в безинерционной среде. Реально же у системы имеется приличная инерция, и хорошо если она гораздо больше за частоту дискретизации ОС, т.к. необходимость разбивать сигнал на дискретны - штука не очень приятная. И если между этими дискретами разница как во времени, так и в амплитуде меньше - регулятор работает аккуратнее (ближе к аналоговому). Это называется передискретизацией, и с нею стоит дружить. Так вот, И-звено тут уже как бы встроено в П-звено через интегрирование результата в OCR1C (которого я и не заметил сразу). Его постоянную времени тут можно задать частотой дискретизации. Допустим П-составляющая нас устраивает, её усиление в притык. В таком случае уже за один семпл переходные процессы в системе должны прекратится, иначе реакция на возмущение окажется меньше ожидаемой и П-звено перерегулирует. Получим генерацию (возбуждение). Допустим система режет полосу где-то на 4кГц (LC-фильтр преобразователя рассчитан на 10кГц и сам дифференциальный усилитель МК режет на 4кГц), это значит что регулятор не должен работать с частотами выше 2...3кГц. Т.е. в данном случае частота дискретизации будет около 4...6кГц, и выше нельзя - возбудится. А АЦП то может и больше. И ведь чем больше он семплов будет гнать - тем чище будет работать регулятор. Поэтому уменьшаем усиление ещё в 8 раз (и того делим результат на 8*8=256) и повышаем частоту дискретизации до 31,25кГц (8МГц/256). Делитель 256 удобен ещё и тем, что выполнение этой процедуры ест 0 тактов. Теперь показываю с чего я начинал и что у меня до сих пор работает вместе с Д-звеном: Ton+=(Ref-ADC)/k;, где k - постоянная времени в условных попугаях. Тот самый делитель, который в нашем случае (и у меня на практике кстати тоже) равен 256-ти. Ton - заполнение ШИМ, которое можно записать непосредственно в OCR1A, однако оно проходит через плотностно-импульсный модулятор для расширения разрядности, и я получаю 16 бит вместо 8-ми. Ref - опорное значение, именуемое Вами как "const". Да, похоже на Ваше решение, только нет ресурсожрущей и ошибкогенерирующей операции деления на хренпоймическую переменную, и есть возможность сдвигами с вычитаниями (быстрым делением на константу) подстроить коэффициент под конкретные условия. 16-ти битный вариант этой процедуры выполняется около десятка тактов, вместе с проверками на переполнения переменных. Теперь Д-звено. Где же оно в Вашем регуляторе? ПИД делает совсем не то же самое, если в Вашем механизме нет фильтра ВЧ, форсирующего переходные процессы в самой схеме. Тут мы пытаемся их игнорировать и работать медленнее, чем работает схема. Но Д-звено пинками под зад эту схему ускоряет, и именно в этом преимущество ПИД-регулятора перед ПИ. У меня это звено выглядит как-то так: Diffdmp+=(Iref-Iout-Diffdmp)/256; Ton+=(Iref-Iout-Diffdmp)/256; А за ним сразу же следует ПИ-звено: Ton+=(Iref-Iout)/256; Всё вместе я и называю ПИД-регулятором. Технически выглядит он у меня более оптимизированным по скорости: E=Iref-Iout; X=(E-IrefmxxDiffdmp)/256; IrefmxxDiffdmp+=X; Ton+=X; Ton+=E/256; Из-за необходимости использования знаковой арифметики (в отличии от беззнаковой в ПИ) код весьма жирный и медленный. 16-ти битный вариант вместе со всеми загрузками и выгрузками переменных в ОЗУ и проверками на переполнения (знаковыми, чтоб их!) жрёт около сотни тактов. Как работает? Имеется некая промежуточная переменная Diffdmp, в которой храниться пропущенный через ВЧ-фильтр сигнал ошибки. Чем он сильнее, тем сильнее модифицируется Ton, в дополнение к модификациям ПИ-регулятора. Резкое отклонение опорного значения или показаний шунта приведёт к резкому изменению Ton в нужном направлении. Причём звено не следит за опорным значением. Оно как бы зажимает в тиски выход и сбавляет скорость изменения тока до осиливаемого ПИ-звеном. Или наоборот резко форсирует переходной процесс, если изменилось опорное значение. А медленный и аккуратный ПИ уже добивает ошибку Д-звена. Поэтому с этим звеном система становится гораздо отзывчивее на управление и возмущение... Что касается передискретизации - чтоб свести шум квантования к минимуму - необходимо уметь работать с шумом. Он размазывает ступеньки и дальнейшее сглаживание позволяет получить промежуточные значения. Сглаживание регулятор делает автоматически, но для этого необходимо поднять разрядность его арифметики. Умножаем аппаратно (бит ADLAR) показания АЦП, и получаем 16 бит с пустыми 6-ю младшими битами и с шумом в следующей паре битах, что очень важно и полезно (те самые, которые Вы решили обрезать). Пропускаем это всё через фильтр и на выходе получаем в младших битах усреднённый результат. Регулятор ведь является фильтром, и сглаживая шум забивает младшие биты 16-ти разрядного значения полезной информацией. В видимом глазу диапазоне шум заметен уже не будет, т.к. запас по частоте дискретизации огромен и на десятках Герц эффективная разрядность спокойно может составлять 16 бит. То же самое касается и ШИМ. У него аж целых 250 килосемплов, но эта передискретизация не используется. Влепив простенький модулятор можно сгенерировать специальный шум последнего бита, который уже на килогерце даст 16 бит при изначальных 8-ми. Львиная доля шума этого модулятора застрянет ещё в LC-фильтре, а остальное не увидит ни глаз, ни техника. Регулятор за это тоже скажет огромное спасибо, т.к. нагрузка станет на порядки послушнее. Таким образом обычная тинька реально может обеспечить 16-ти битное разрешение в интересующей нас полосе, а её ШИМ способен играть музыку так, что от обычного плеера по качеству не каждый отличит... [Исправлено: INFERION, 24.10.2013 в 16:45] |
Поблагодарили: 1 раз |
Maksoff (24.10.2013)
|
24.10.2013, 16:45 | 58 |
Завсегдатай Фонарёвки
Регистрация: 22.09.2013 Последняя активность: 14.06.2022 22:39 Адрес: Vienna
Сообщений: 918
Сказал(а) спасибо: 126
Поблагодарили: 322 раз(а) в 166 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
INFERION, это просто замечательно! Занес себе в избранное, скопировал чтобы не потерялось.
Может имеет смысл сделать отдельную тему, как руководство начинающим драйверописцам? И я все равно не уловил одну деталь - как часто должен вызываться чтение АЦП (я ведь правильно понял, что значения суммируются некоторое время для передискретизации), как часто стоит вызывать эту функцию ПИДа, которая, если я правильно понял, и пишет в ШИМ нужное значение? Ну и конечно, было бы интересно посмотреть, как работают защиты при всем при этом. |
24.10.2013, 17:13 | 59 | |||
Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24 Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
Цитата:
Но эта тема не популярная, а в теме за расширение разрядности ШИМ меня и вовсе закидали помидорами: https://forum.fonarevka.ru/... Конечно полезно было бы такие посты собрать в одном месте, но там активности нет. Тем более что я уже много интересного с тех пор придумал (пока лепил Indigo 5.0 с его "матаном"). Цитата:
Цитата:
АЦП запускается аппаратно каждый раз на семпл позже, и так 64 или 32 семпла подряд, после чего сдвиг возвращается на место. Таким образом АЦП как бы скользит по периоду ШИМ и за 32 семпла помехи от ШИМ проезжаются по всем фазам измерения, что здорово снижает влияние заполнения ШИМ на показания АЦП, а шум становится похожим на белый. Раньше у меня это были отдельные регуляторы, которые подкручивали опорное значение тока. Терморегулятор прикидывался термостатом, а защита от переразряда батареи прикидывалась стабилизатором входного напряжения. Периодически программа отвлекается на измерение и обработку дополнительных параметров. На частоте около 60...120Гц - этого достаточно чтоб работа казалась плавной. Ссылку на пример такой реализации я чуть выше уже кинул. Сейчас защита от перегрузки батареи (как я её теперь называю) хитрее и регулятора в ней нет. Программа вычисляет всё с первого раза, т.к. знает внутреннее сопротивление батареи. Тут уже никакой магии - обычная арифметика. Не только удерживает напряжение на уровне 3V, но и ограничивает просадку напряжения в банке на уровне 0,5V. Заодно корректирует показания индикатора заряда батареи, т.к. напряжение без нагрузки вычисляется на ходу. Что касается защиты от перенапряжения на выходе - тоже простая арифметика. Под конкретное напряжение питания вычисляется максимально допустимое заполнение. В безразрывном режиме его можно просто ограничить, но т.к. я не контролирую реальный режим работы дросселя (я его лишь вычисляю), то при достижении этого порога лучше моментально тухнуть без вопросов, т.к. при отсутствии нагрузки рост напряжения ограничение заполнения не остановит... [Исправлено: INFERION, 24.10.2013 в 17:20] |
|||
24.10.2013, 18:50 | 60 |
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40 Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Re: Драйвер 2,5А для XM-L, помогите с программой
ха-ха...
вставляю формулу в программу и шим перестает работать)))) |