Мощный двигатель на полтора киловатта (3 пиково)
аккумуляторы литиевые токоотдача 100 ампер (пиково 300)
напруга аккумов 24 вольта(6 банок лития последовательно)
соответственно контроллер двигателя(ибо двигатель безсенсорный бесколекторник)
на транзюках IRF3205
Немного предистории...
Механика от мопеда ямаха минт....самый экономичный редуктор цепной и простое центробежное сцепление на 3500 оборотов...
заменой пружинок можно добиться начала срабатывания на 500-800 оборотах....не в этом суть
Двигатель посажен на вал мотора который заменен самостоятельно выточенным и крутит напрямую сцепление через сальник.
Игрался я с этой механикой в гараже в тисках - получил такую информацию...
ток холостого хода(без масла) 20 ампер...на любых оборотах....как дань моде
под заторможенным колесом (канатик и кантер) ток вообще никак не меняется пока не начнет упираться сцепление....как только этот момент настал 1-3% резистора тяги(просто PWM модуляция) резко увеличивают ток до 100 ампер а тягу до 9-11 килограмм...
попробывал в таком режиме покататься - результат вот - http://clawham.hopto.org/DriveD/PubD/54/MVI_7651.avi 14 мегабайт
пришел к выводу что вообще нереально чтолибо делать если не контролировать ток контроллером и не ограничивать его...
промучавшись недели 2-3 родилась схема усилителя-выпрямителя-интегратора на простых операционниках с минимумом обвязки и обеспечивающая работу что с шунтом(фазный провод) что с токовым трансформатором(шунт просто больше по номиналу и полная развязка по мощному питанию...
Схема примерная вот -

контроллер мега8а
инструментальный усилитель техасский ina2126, далее lm358 как выпрямитель и повторитель выхода с выпрямителя...
игрался с шунтами и точностью ... добился устойчивого сигнала на ацп в 7 попугаев при изменении входа на 0.1 милливольт(точнее просто нет приборов под рукой)....
остановился на токовом трансформаторе(взял простой трансик от антенного усилителя со сгоревшей первочкой и пропустил вокруг центрального штыря один виток силового провода...12 вольтовую вторичку нагрузил 5 оммами....получился амперметр показывающий в милливольтах ток*10 ... немного усилив и выпрямив это напряжение получил 100 попугаев ацп на 1 ампер - это для экспериментов на столе достаточно(можно добиться и 1 миллиампера на 1 попугай ацп) ну да не в этом дело....осцилографом смотрел вход АЦП на 50 герцах и нагрузке - галогенке - при перепаде тока с 1.5 ампер до 4 на входе напруга увеличивается за 50-70 миллисекунд...довольно быстро...
естественно что на моторе будет до 1-2 килогерц но это я осцилографом не проверял...просто взял маленький моторчик и показания по АЦПшным попугаям сошлись с показаниями тока от батарейки(постоянка) - вывод вся аналоговая часть рабоатет...
Теперь самое главное....я все измерения и расчеты провожу в прерывании АЦП.....работает на 250 килогерцах...мега 8 от внутреннего гена 8 мегагерц....кроме АЦП у меги больше нет задач - она в основном цикле просто в уарт на 57600 килобитах гонит все данны расчетов
Проблема вот в чём....я второй день до 2 ночи не спал...играюсь с настройками и никак не могу получить удобоваримый результат! либо начинаются автоколебания(то полный газ и ток до 2 ампер то сбивает газ до нуля), либо слишком медленная реакция(мотор раскручивается поддерживая 200 амиллиампер но стоит его резко нагрузить - ток до 2 ампер и плавно понижается...)
Эти все эффекты как-бы недопустимы на большом моторе ибо приведут к тому что на видео...нагрузка то на мотор меняется достаточно резко хоть он и есть маховик...
пробывал уже всё что только представлял себе и думал...никак не могу придумать толкового алгоритма ограничения выхода при превышении тока...не хватает мне видимо образования....
прошивку конечно же предоставляю на общий суд! http://clawham.hopto.org/DriveD/PubD/54/31_moped.zip
по тексту там всё комментировано....разве что выход...нужно понимать что выход - PWM ориентированный...1 миллисекунда = 0 газа 2 миллисекунды = 100% газа... таймер настроен на PWM и клоцает каждую микросекунду - в него надо загружать значения 990 + (значение выхода 0...1000) ....
пытался сообразить PI регулятор, П и И отдельно....ничего не получается....моторчик от сидюка...поэтому с ним ничего не произойдет да и питание 8 вольт...но я не могу понять почему я никак не могу хотябы приблизиться к нужному результату.....в принципе был уже один раз случайно подобный требуемуму результат...когда я увеличивал в 14 раз ошибку(просто случайно ошибся) но получилось что ток стабилизируется в два раза меньший...
Код: Выделить всё
unsigned int adcdat=0;
unsigned char ind = 0;
unsigned int GasOut=0;
unsigned long int GasOutTemp=0;
unsigned int PWMout=0;
unsigned int PWMoutTemp=0;
unsigned int GasInput=0;
unsigned int GasTemp=0;
unsigned int GasDelta=0;
unsigned int IInput=0;
unsigned int ITemp=0;
unsigned int IsetInput=0;
unsigned int IsetTemp=0;
unsigned int GasMinInput=0;
unsigned int GasMinTemp=0;
unsigned int GasMaxInput=0;
unsigned int GasMaxTemp=0;
#define GasPresc 3
#define GasMinPresc 2
#define GasMaxPresc 2
#define IPresc 0
#define IsetPresc 2
#define GasOutPresc 2
#define PWMoutPresc 3
Код: Выделить всё
// тут то вся наша обработка!
if(ind==1)
{
// вход 1 (24 - PC1) это вход с потенциометра газа
if(GasInput<adcdat)
{
// переменная газа не доганяет - инкрементируем
if(GasTemp<65530)
GasTemp+=adcdat-GasInput;
}
else
{
//переменная газа перелетела реальное значение - уменьшаем
if(GasTemp>0)
GasTemp-=GasInput-adcdat;
}
GasInput = GasTemp>>GasPresc;
if(GasInput>GasMinInput)
GasOutTemp=GasInput-GasMinInput;
else
GasOutTemp=0;
GasOutTemp=(GasOutTemp*1000);
GasOut=GasOutTemp/GasMaxInput;
}
else if(ind==4)
{
// это вход тока (27 нога )
if(IInput<adcdat)
{
// переменная тока не доганяет - инкрементируем
if(ITemp<65530)
ITemp+=adcdat-IInput;
}
else
{
//переменная тока перелетела реальное значение - уменьшаем
if(ITemp>0)
ITemp-=IInput-adcdat;
}
IInput = ITemp>>IPresc;
// тут считаем влияние тока на PWM
if(GasOut>50)
{
// если газ больше 50 то работаем
if(IInput>IsetInput)
{
// перелетели заданный ток...превышение
// будем уменьшать выход pwm пока не упремся в 50 - типа минимум
if(PWMout>50)
{
//PWMoutTemp-=(IInput-IsetInput)>>1;
GasDelta = IInput-IsetInput;
if(GasDelta<10)
PWMoutTemp-=GasDelta;
else if(GasDelta<30)
PWMoutTemp-=GasDelta>>1;
else if(GasDelta<50)
PWMoutTemp-=GasDelta>>2;
else if(GasDelta<100)
PWMoutTemp-=GasDelta>>3;
PWMoutTemp--;
}
}
else
{
// недобор тока - увеличиваем pwm до значения входа газа
if(PWMout<1024)
if(PWMout<GasOut)
{
GasDelta = GasOut-PWMout;
if(GasDelta>10)
PWMoutTemp+=2;
else if(GasDelta>30)
PWMoutTemp+=3;
else if(GasDelta>50)
PWMoutTemp+=4;
else if(GasDelta>100)
PWMoutTemp+=5;
else if(GasDelta>300)
PWMoutTemp+=6;
//PWMoutTemp+=(GasOut-PWMout)<<2;
PWMoutTemp+=1;
}
else
PWMoutTemp-=PWMout-GasOut;
}
}
else
{
// иначе на выход PWM бросаем ноль
PWMoutTemp=0;
}
// считаем PWMout из сглаживающей переменной
PWMout = PWMoutTemp>>PWMoutPresc;
// проверяем и коректируем лимиты
if(PWMout<40)
PWMout=0;
if(PWMout>1024)
PWMout=1024;
// выдаём заданный уровень выходного сигнала
OCR1A = 990+PWMout;
}
else if(ind==2)
{
// вход переменника установки нуля входа газа
if(GasMinInput<adcdat)
{
// переменная газа не доганяет - инкрементируем
if(GasMinTemp<65530)
GasMinTemp++;
}
else
{
//переменная газа перелетела реальное значение - уменьшаем
if(GasMinTemp>0)
GasMinTemp--;
}
GasMinInput = GasMinTemp>>GasMinPresc;
}
else if(ind==0)
{
// вход переменника установки усиления входа газа
if(GasMaxInput<adcdat)
{
// переменная газа не доганяет - инкрементируем
if(GasMaxTemp<65530)
GasMaxTemp++;
}
else
{
//переменная газа перелетела реальное значение - уменьшаем
if(GasMaxTemp>0)
GasMaxTemp--;
}
GasMaxInput = GasMaxTemp>>GasMaxPresc;
}
else if(ind==5)
{
// вход переменника установки ограничения тока
if(IsetInput<adcdat)
{
// переменная тока задачи не доганяет - инкрементируем
if(IsetInput<65530)
IsetTemp++;
}
else
{
//переменная тока задачи перелетела реальное значение - уменьшаем
if(IsetInput>0)
IsetTemp--;
}
IsetInput = IsetTemp>>IsetPresc;
}
Очень прошу помочь в решении данной головоломки ...


