Светодиодные фонари и световые приборы. Всё о светотехнике.
Изображения Дневники Группы Поиск
Вернуться   Форум FONAREVKA.RU Лаборатория Разработка и модификация фонарей Разработка и модификация электроники фонарей
Расширенный поиск
Забыли пароль? Регистрация

  • О нашем проекте
  • Светотехника и световые приборы
  • Правила форума
Проект FONAREVKA.RU специализируется на предоставлении всей необходимой информации по светотехнике:

— светодиодные фонари;
— различные источники питания;
— разнообразные зарядные устройства;
— освещение помещений и наружное освещение;
— световые приборы для личного, пассажирского и грузового транспорта;
— специальные световые приборы для медицины, для растений, для аквариумов, для террариумов, а также аварийно-сигнальные световые приборы;
— альтернативные источники света;
— лазеры и лазерная техника.

Если у вас есть вопросы по выбору фонарей, аккумуляторов и зарядных устройств ознакомьтесь с FAQ от наших экспертов:

F.A.Q. по выбору фонарей различных типов;
F.A.Q. по выбору аккумуляторов;
F.A.Q. по выбору зарядных устройств.
Ответ  Создать новую тему
Просмотров в теме 15043   Ответов в теме 71   Подписчиков на тему 5   Добавили в закладки 0
Опции темы Поиск в этой теме
Старый 04.10.2013, 12:02   41
INFERION

 
Аватар для INFERION
 
Регистрация: 07.04.2013
Последняя активность: 13.06.2023 02:24
Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

Цитата:
чтобы узнать смещение дифференциального усилителя соединяем входы между собой, включаем шим на номинальной нагрузке, и записываем несколько результатов измерения в эпром для анализа?
Соединение входов между собой может дать отличный результат от подключенных к шунту, но без протекающего через него тока. Нужно на практике смотреть что получается. А ШИМ у меня влиял не столько реальным дёрганьем лапой, сколько внутренним тактированием таймера с PLL. Т.е. необязательно выкручивать на нормальную нагрузку, можно ШИМ просто в ноль скрутить и глянуть на смещение. В EEPROM то писать зачем? Это проблемная память. Причём по трём причинам:
1. Ограниченный ресурс. Гарантируют 100 000 циклов записи, а дальше как повезёт. EEPROM технически является Flash памятью и имеет стандартную для Flash болячку - заряд при стирании полностью удалить не удаётся, и со временем он накапливается до критического уровня, что делает невозможным стирание.
2. Процедура записи весьма геморройная. Мало того что требуется произвести запись в 3 регистра ввода/вывода, так ещё и необходимо запустить процедуру записи хитрой комбинацией действий, которая придумана для защиты от случайной записи мусора когда МК колбасит из-за сорвавшегося тактирования или низкого напряжения питания...
3. Процесс записи длится 3,6мс. Это очень долго, и всё это время придётся ждать, прежде чем EEPROM освободится для чтения или записи следующего байта.

Так вот я к чему. Возможно Вы имели ввиду использование ОЗУ? Или имеется ввиду запись с целью прочитать программатором и посмотреть? А что это даст? Смещение в каждом чипе индивидуальное и плавает в зависимости от кучи факторов (питание, температура и т.п.), в том числе и долговременных (возраст чипа и т.п.). Аналоговая схемотехника неидеальная, со слабыми сигналами всегда так. Программа должна просто самостоятельно его вычитать и обновлять при первой возможности (при каждой загрузке, или включении). Знать его необязательно. А если не планируется работать с большим диапазоном токов, то на калибровку вообще можно забить. Пара десятков LSB погоды не сыграет.
Цитата:
т.е. последний бит используется для хранения знака, и получается что диапазон значений ограничен 512, а в униполярном режиме диапозон 1024
В даташите всё описано, в том числе и формулы для расчёта значения в зависимости от конфигурации АЦП и входного значения. В дополнительном коде знак передаётся самым старшим битом (MSB). АЦП как бы начинает выдавать значения -512...+511, так что у него остаются прежние 1024 ступеньки, просто ноль выезжает на середину. Причём реально напряжение ИОН удваиваться, т.к. для достижения этого диапазона (10 бит) приходится вместо 0...55мВ подавать на вход -55...+55мВ. Из-за этого разрядность и страдает при использовании униполярного сигнала, я не знаю зачем так сделали...
Языки программирования "высокого" уровня по умолчанию используют такое представление чисел, так что в биполярном режиме АЦП даже более "родные" числа выдаёт, и особо заморачиваться с этими знаками и работой с ними не приходится.
Цитата:
отрицательно напряжение если и переваривает то идентифицирует как положительное
Всмысле? АЦП не переполняется, он упирается в мин. и макс. значения. Ниже -512 и выше +511 он никак не переполнится. Так же как и ниже 0 или выше 1023 в униполярном режиме.

[Исправлено: INFERION, 04.10.2013 в 12:11]
INFERION вне форума   Ответить с цитированием Вверх
Поблагодарили: 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
INFERION

 
Аватар для INFERION
 
Регистрация: 07.04.2013
Последняя активность: 13.06.2023 02:24
Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

Цитата:
Посмотреть сообщение Сообщение от Разряд :
1 почему АЦП должен так шуметь если он так не шумит?
АЦП должен шуметь, если ему создать условия. В режиме ADC Noise Reduction он действительно не шумит, но ведь кроме измерения у МК и другой работы хватает. И когда её делать, если даже дышать нельзя? И вот интересное явление тут и проявляется - без шума передискретизация не работает и результат становится хуже. Мы получаем 10 бит вместо 16-ти, к примеру, как бы не старались. Да ещё и куча плясок с бубном вокруг тишины, чтоб не дай бог АЦП не соскочил на соседнюю ступеньку из-за шума. Я считаю что делать критичные к шуму механизмы вместо того, чтоб этот шум использовать - как минимум неэффективно и сложно (бороться с шумом мне часто сложнее, чем заставить его работать на себя). Может я и предвзято отношусь к этому делу после опытов с цифровым звуком. Слух наглядно продемонстрировал разницу в подходах. Сейчас попробую откопать старый проект и сгенерировать пару файликов. В обоих 8 бит звук закодировать, но один с простым отсечением младших разрядов, а другой с эффективной передискретизацией.
Цитата:
Посмотреть сообщение Сообщение от Разряд :
2 какие проблемы с дифференциальным усилителем я не замечал особых погрешностей и даже при 50мВ на токосенсоре в стабы напруги выдают отличную стабильность тока.
На 50мВ конечно, а если понадобится 0,5мВ? Вот тут проблемы и начинаются, а они между прочем решаемы. Если изначально ставить перед собою упрощённые задачи - не только проблем, но и интересного результата не будет. Мне вот хочется покрутить ток простейшей схемой с ДД в 60...70Дб на этой тиньке, реально? Практика показала что это реально...

Я выше написал что все эти моменты необязательны, если требуется получить какой-то конкретный ток и всё. На 50мВ АЦП и так удовлетворительно работать будет, без особых заморочек.
Цитата:
Я при измернии напруги сделал усреднение до 10 измерений но из-за того что это не давало не каких результатов отказался, как разница в показаниях отсутствовала, правда тут аналоговая часть питалась от претензионного малошумящего стаба, в БП измерение тока нарузки идёт до 0, то есть значения 1, 2, 3 стоят не прыгают.
А мне пришлось внутрикристальным измерением вылаливать разницу в единицы милливольт. VCC страшно шумел, и это помогло. При шаге порядка 16мВ благодаря шуму спокойно улавливаю доли милливольта и могу рассчитывать внутреннее сопротивление батареи. Очень жаль что АЦП на борту не Сигма-Дельта, он в плане передискретизации просто волшебный. Их разрядность не ограничена вообще, а конструктивно они проще АЦП последовательного приближения. Гуглятся даже решения на рассыпухе к 2313-й тиньке, но существуют и готовые решения вроде INA219.

[Исправлено: INFERION, 05.10.2013 в 02:56]
INFERION вне форума   Ответить с цитированием Вверх
Старый 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
Mishany
Новичок
 
Регистрация: 30.09.2013
Последняя активность: 13.04.2014 11:40
Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

а 85 тиньке оказывается два шима один обычный и второй скоростной (тот что мне нужен) со своими регистрами, даташит скоро в ночных кашмарах будет сниться....
Mishany вне форума   Ответить с цитированием Вверх
Старый 05.10.2013, 17:42   46
INFERION

 
Аватар для INFERION
 
Регистрация: 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, там же настраивается и тип выхода ШИМ, да и всё вроде. Если это кажется сложным, тогда вот:
Если даташит тиньки кажется громоздким - посмотрите ЭТО. Современный МК, информация очень сжатая и неполная, ибо и так... 1705 страниц. И да, это лишь один файл документации. Основной, но не единственный. У Atmel принято всё совать в один pdf, но это скорее исключение, чем правило. Остальные делают как обычно - разбрасывают распиновку, электрические характеристики, систему команд, периферию, описание ядра, контроллера прерываний и т.п. по разным файлам. И сиди собирай всё в кучу. Одна конфигурация тактирования и ШИМ у меня килобайт сожрала и полотно кода (причём Сишного) с пару мониторов. Потом выяснилось что в даташите была ошибка, из-за которой возможно USB адекватно и не работал. Исправили недавно, и фиг знает что там ещё не исправлено. Ну так что должно снится в кошмарах? Даташит на 8-ми лапую тиньку? ))

[Исправлено: INFERION, 05.10.2013 в 18:04]
INFERION вне форума   Ответить с цитированием Вверх
Старый 06.10.2013, 21:00 Автор темы   47
Mishany
Новичок
 
Регистрация: 30.09.2013
Последняя активность: 13.04.2014 11:40
Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

Понял для себя, что с нуля мне не позубам программа, нашел простую понижайку с исходником написанную в codevision под 25 тини, попробую повторить на аврстудио для 85, код вроде почти понятен, нашел процедуру запуска PLL, буду пробовать...
Mishany вне форума   Ответить с цитированием Вверх
Старый 12.10.2013, 20:56 Автор темы   48
Mishany
Новичок
 
Регистрация: 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]
Mishany вне форума   Ответить с цитированием Вверх
Старый 14.10.2013, 21:45 Автор темы   49
Mishany
Новичок
 
Регистрация: 30.09.2013
Последняя активность: 13.04.2014 11:40
Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

Цитата:
Посмотреть сообщение Сообщение от Разряд :
А без мониторинга питания разве получится мощность узнать только по токосенсору?
а зачем надо знать мошность, что бы поддерживать определенный ток?
Мне необходимо стабилизировать ток, который зависит только от напряжения на шунте и сопротивления самого шунта, а остальное уже не важно.
I=U/R
Mishany вне форума   Ответить с цитированием Вверх
Старый 22.10.2013, 21:47 Автор темы   50
Mishany
Новичок
 
Регистрация: 30.09.2013
Последняя активность: 13.04.2014 11:40
Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

добил программу
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int adc_counter,current;
volatile unsigned long current_value;
__attribute__((OS_main))


SIGNAL(SIG_ADC)
{
ADCSRA = 0x00; // Выключаем АЦП 
current_value = current_value + ADCH; // Суммируем измеренные значения тока и помещаем в буфер
adc_counter++; // Увеличиваем счетчик выборок АЦП на 1
//Включаем АЦП
ADCSRA=0b11111101;
}
int main(void) 
{
    CLKPR=0x80;
    CLKPR=0x00;
    PORTB=0b00000000;
    DDRB=0b00000010;
    PLLCSR=0x02;
    while ((PLLCSR & 1)==0);
    PLLCSR|=0x04;
    TCCR1=0x61; //64
    GTCCR=0x00;
    TCNT1=0x00;
    OCR1A=0x00;
    OCR1B=0x00;
    OCR1C=0xFF;
    ACSR=0x80;
    ADCSRB=0x00;
    OCR1A=10;   
ADMUX=0b10100011;
ADCSRA=0b11111101;
sei();

while (1)
   {
      if (adc_counter > 20)
      {
        ADCSRA = 0x00;
        current = (current_value/adc_counter);
        if (current_value > 164)
        {
           OCR1A--;
        }
        if (current_value<162)
        {
           OCR1A++;
        }
    }        
        current_value = 0;
        adc_counter = 0;
      ADCSRA=0b11111101;
      }
    
}

1. пришлось использовать внешний ОУ в дифференциальном включении с Ku=30 и использовать один канал АЦП в обычном режиме.
если есть предложения в улучшении алгоритма стабилизации с радостью выслушаю.

[Исправлено: Mishany, 22.10.2013 в 21:53]
Mishany вне форума   Ответить с цитированием Вверх
Старый 23.10.2013, 16:30   51
INFERION

 
Аватар для INFERION
 
Регистрация: 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]
INFERION вне форума   Ответить с цитированием Вверх
Старый 23.10.2013, 16:37   52
Maksoff
Завсегдатай Фонарёвки
 
Аватар для Maksoff
 
Регистрация: 22.09.2013
Последняя активность: 14.06.2022 22:39
Адрес: Vienna
Сообщений: 918
Сказал(а) спасибо: 126
Поблагодарили: 322 раз(а) в 166 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

INFERION, ну ведь это же и есть решение в лоб.
Светит? Светит! Пользователь рад? Рад! Так что начало положено.
Цитата:
Посмотреть сообщение Сообщение от INFERION :
Зачем делить current_value?
перечитал код, в этом месте аж передернуло.

А ведь и мне (и другим начинающем программистам драйверов) было бы интересно почитать, что не забыть сделать, и как это стоит делать (те же защиты, или умные регуляторы..)
Maksoff вне форума   Ответить с цитированием Вверх
Поблагодарили: 1 раз
Mishany (23.10.2013)
Старый 23.10.2013, 16:59   53
INFERION

 
Аватар для INFERION
 
Регистрация: 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....
Ну и самое главное тут - скорость. Защиты должны работать достаточно быстро, регулятор тока тем более. В повышалке может пригодится защита от перенапряжения на выходе. Можно влепить делитель напряжения, а можно и матаном вопрос этот кое как решить, сэкономив лапу МК.
INFERION вне форума   Ответить с цитированием Вверх
Поблагодарили: 1 раз
Maksoff (23.10.2013)
Старый 23.10.2013, 23:24 Автор темы   54
Mishany
Новичок
 
Регистрация: 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)
   {
    чтото еще в перерывах между прерываниями
   }
}
Так как все это будет работать на мотоцикле там в момент запуска двигателя происходит просадка до 8-9 вольт потом резкое поднятие до 14,5, вот думаю задействовать еще один канал АЦП для контроля бортового напряжения и если оно меньше 13-14 В шим запускать на 10-20% в режиме габарита.

[Исправлено: Mishany, 23.10.2013 в 23:56]
Mishany вне форума   Ответить с цитированием Вверх
Старый 24.10.2013, 05:57   55
INFERION

 
Аватар для INFERION
 
Регистрация: 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]
INFERION вне форума   Ответить с цитированием Вверх
Поблагодарили: 1 раз
Maksoff (24.10.2013)
Старый 24.10.2013, 13:20 Автор темы   56
Mishany
Новичок
 
Регистрация: 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;
      }
Посчитал на бумажке с примерными данными для моего случая за 2-3 прохода выходит в режим если не учитывать инерционность системы в целом. если учитывать инерционность думаю достаточно будет запуска ацп каждые 50-100ms.
Возможно использование ПИД в моем случае не оправдано и работа с банальным -- и ++ не будет отличаться от работы с использованием ПИД?
Возможно ли такое?
(прочитал это) моя формула делает тоже самое только проще до безобразия в коде.

[Исправлено: Mishany, 24.10.2013 в 13:49]
Mishany вне форума   Ответить с цитированием Вверх
Старый 24.10.2013, 16:19   57
INFERION

 
Аватар для INFERION
 
Регистрация: 07.04.2013
Последняя активность: 13.06.2023 02:24
Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

Цитата:
Посмотреть сообщение Сообщение от Mishany :
моя формула делает тоже самое только проще до безобразия в коде.
Давайте поспорим. Сначала я критикую Ваш регулятор, а затем выкладываю на "стол" свой...
Цитата:
Посмотреть сообщение Сообщение от Mishany :
за 2-3 прохода выходит в режим
Действительно. Я не обратил внимание что каждый раз берётся уже модифицированное значение OCR1A, а это уже не пропорциональный регулятор, а пропорционально-интегральный. Ошибка накапливается и через некоторое время система входит в равновесие, когда опорное значение равно показаниям АЦП. Это если параметры окажутся устойчивыми, т.к. тут не предусмотрен механизм их регулировки. Давайте посмотрим допустимо ли тут усиление пропорциональной составляющей? С обычной нагрузкой и в обычной схеме ток будет меняться где-то на 4% с каждым LSB в OCR1A на максимальных (наименее устойчивых) токах.
Как узнал? Понижалка (да и повышалка тоже), работающая в режиме с безразрывным током дросселя, представляет собою обычный трансформатор постоянного напряжения. Т.е. чтоб узнать напряжение на выходе при конкретном заполнении - достаточно сделать это: Vin*OCR1A/256=Vout. Дальше лезем в даташит нашего XM-L2 (допустим) и смотрим на его ВАХ. По ней вычисляем минимальное дифференциальное сопротивление этой нагрузки - именно оно нам покажет как будет разгуливать ток в зависимости от напряжения. Добавляем к нему сопротивление дросселя, ключа, шунта и т.п. Они облегчают ситуацию. И по имеющемуся сопротивлению смотрим на сколько у нас подпрыгнет ток при увеличении заполнения на 1LSB...
К примеру нам необходимо подправить ток на 4% и мы ожидаем изменение менее чем на 1LSB (да, значения меньше 1LSB тут никак не учитываются, и это плохо, но об этом позже). К примеру у нас ток почти максимальный (наименее устойчивый - помним): 180*(1000/4)/(960/4)=187,5LSB. Мы за один цикл получили почти 8ми кратное (!) перерегулирование. Я делил значение ADC на 4 потому что Вы решили отбросить 2 младших бита, ухудшив таким образом шумовые характеристики в 4 раза. П-звено не годится, теперь рассмотрим И-звено:

П-звено реагирует шустро, однако только в безинерционной среде. Реально же у системы имеется приличная инерция, и хорошо если она гораздо больше за частоту дискретизации ОС, т.к. необходимость разбивать сигнал на дискретны - штука не очень приятная. И если между этими дискретами разница как во времени, так и в амплитуде меньше - регулятор работает аккуратнее (ближе к аналоговому). Это называется передискретизацией, и с нею стоит дружить. Так вот, И-звено тут уже как бы встроено в П-звено через интегрирование результата в 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]
INFERION вне форума   Ответить с цитированием Вверх
Поблагодарили: 1 раз
Maksoff (24.10.2013)
Старый 24.10.2013, 16:45   58
Maksoff
Завсегдатай Фонарёвки
 
Аватар для Maksoff
 
Регистрация: 22.09.2013
Последняя активность: 14.06.2022 22:39
Адрес: Vienna
Сообщений: 918
Сказал(а) спасибо: 126
Поблагодарили: 322 раз(а) в 166 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

INFERION, это просто замечательно! Занес себе в избранное, скопировал чтобы не потерялось.
Может имеет смысл сделать отдельную тему, как руководство начинающим драйверописцам?
И я все равно не уловил одну деталь - как часто должен вызываться чтение АЦП (я ведь правильно понял, что значения суммируются некоторое время для передискретизации), как часто стоит вызывать эту функцию ПИДа, которая, если я правильно понял, и пишет в ШИМ нужное значение?

Ну и конечно, было бы интересно посмотреть, как работают защиты при всем при этом.
Maksoff вне форума   Ответить с цитированием Вверх
Старый 24.10.2013, 17:13   59
INFERION

 
Аватар для INFERION
 
Регистрация: 07.04.2013
Последняя активность: 13.06.2023 02:24
Адрес: Украина, Полтава
Сообщений: 5774
Сказал(а) спасибо: 340
Поблагодарили: 8154 раз(а) в 2385 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

Цитата:
Посмотреть сообщение Сообщение от Maksoff :
Может имеет смысл сделать отдельную тему, как руководство начинающим драйверописцам?
https://forum.fonarevka.ru/...
Но эта тема не популярная, а в теме за расширение разрядности ШИМ меня и вовсе закидали помидорами: https://forum.fonarevka.ru/...
Конечно полезно было бы такие посты собрать в одном месте, но там активности нет. Тем более что я уже много интересного с тех пор придумал (пока лепил Indigo 5.0 с его "матаном").
Цитата:
Посмотреть сообщение Сообщение от Maksoff :
И я все равно не уловил одну деталь - как часто должен вызываться чтение АЦП
У меня обычно он работает в автотриггерном режиме на частоте 31,25кГц в среднем (стартует по OCR0A, значение в котором с каждым семплом модифицируется специальным генератором пилы). Семпл меряет за 216 (вроде) тактов, остальное - запас для расчехления обработчиков + всякие тонкости в подавлении помех.
Цитата:
Посмотреть сообщение Сообщение от Maksoff :
(я ведь правильно понял, что значения суммируются некоторое время для передискретизации)
Не правильно. Регулятор обрабатывает каждый семпл, как только он будет получен. Т.е. работает на частоте 31,25кГц. Всё железо и программа синхронизированы, поэтому регулятор по переполнению 0-го таймера понимает когда можно забрать данные с АЦП и переконфигурировать его. Складывать семплы имеет смысл если программа не успевает обрабатывать каждый по отдельности. Это хоть и увеличит разрешение по амплитуде, но не улучшит разрешения по времени...

АЦП запускается аппаратно каждый раз на семпл позже, и так 64 или 32 семпла подряд, после чего сдвиг возвращается на место. Таким образом АЦП как бы скользит по периоду ШИМ и за 32 семпла помехи от ШИМ проезжаются по всем фазам измерения, что здорово снижает влияние заполнения ШИМ на показания АЦП, а шум становится похожим на белый.
Цитата:
Посмотреть сообщение Сообщение от Maksoff :
Ну и конечно, было бы интересно посмотреть, как работают защиты при всем при этом.
Раньше у меня это были отдельные регуляторы, которые подкручивали опорное значение тока. Терморегулятор прикидывался термостатом, а защита от переразряда батареи прикидывалась стабилизатором входного напряжения. Периодически программа отвлекается на измерение и обработку дополнительных параметров. На частоте около 60...120Гц - этого достаточно чтоб работа казалась плавной. Ссылку на пример такой реализации я чуть выше уже кинул. Сейчас защита от перегрузки батареи (как я её теперь называю) хитрее и регулятора в ней нет. Программа вычисляет всё с первого раза, т.к. знает внутреннее сопротивление батареи. Тут уже никакой магии - обычная арифметика. Не только удерживает напряжение на уровне 3V, но и ограничивает просадку напряжения в банке на уровне 0,5V. Заодно корректирует показания индикатора заряда батареи, т.к. напряжение без нагрузки вычисляется на ходу. Что касается защиты от перенапряжения на выходе - тоже простая арифметика. Под конкретное напряжение питания вычисляется максимально допустимое заполнение. В безразрывном режиме его можно просто ограничить, но т.к. я не контролирую реальный режим работы дросселя (я его лишь вычисляю), то при достижении этого порога лучше моментально тухнуть без вопросов, т.к. при отсутствии нагрузки рост напряжения ограничение заполнения не остановит...

[Исправлено: INFERION, 24.10.2013 в 17:20]
INFERION вне форума   Ответить с цитированием Вверх
Старый 24.10.2013, 18:50 Автор темы   60
Mishany
Новичок
 
Регистрация: 30.09.2013
Последняя активность: 13.04.2014 11:40
Адрес: Москва
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях

По умолчанию Re: Драйвер 2,5А для XM-L, помогите с программой

ха-ха...
вставляю формулу в программу и шим перестает работать))))
Mishany вне форума   Ответить с цитированием Вверх
Ответ  Создать новую тему





Copyright ©2007 - 2024, FONAREVKA.RU

Powered by vBulletin®
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot

Правила форума | Отказ от ответственности

Время генерации страницы 0.20979 секунды с 16 запросами