Пришел примерно к следующему - управляющие импульсы МК выдает частотой ~31кГц с помощью 16-битного таймера, в теле программы в цикле while(1) идет поочередный замер тока и напряжения:
Код: Выделить всё
while(1)
{
ADCSRA |= (1 << ADSC);
while ((ADCSRA&(1 << ADIF))== 0);
if(ADMUX & _BV(MUX0))
{
Voltage = (ADCL|ADCH << 8);
}
else
{
Currency = (ADCL|ADCH << 8);
}
ADMUX ^= _BV(MUX0);
ADMUX ^= _BV(MUX1);
}
}
Код: Выделить всё
ISR(TIMER2_OVF_vect)
{
if(Mode == MPPT)
{
//:: Если замер первый...
if(Flag == 0)
{
//:: Считаем мощность
Power_Prev = (unsigned long int)(Currency)*(Voltage);
//:: Делаем пробный заброс КЗ
OCR1A = (OCR1A + MPPT_DC_Step);
DC = DC + MPPT_DC_Step;
//:: И отмечаем, что первый замер сделан
Flag = 1;
}
//:: Все последующие замеры считаются здесь
else
{
//:: Считаем мощность
Power = (unsigned long int)(Currency)*(Voltage);
//:: Если оно больше предыдущего, то...
if(Power > Power_Prev)
{
//:: Продолжаем шагать в ту же сторону
if(OCR1A<MAX)
OCR1A = (OCR1A + MPPT_DC_Step);
}
//:: Если оно меньше или равно предыдущему, то...
else if(Power < Power_Prev)
{
//:: Шагаем в другую сторону
if(OCR1A>MIN)
OCR1A = (OCR1A - MPPT_DC_Step);
}
//:: Используем это напряжение на следующем шаге
Power_Prev = Power;
}
}
}
Код: Выделить всё
void SearchAndDestroy(void)
{
PWM++;
newpower = rawW;
if(newpower == oldpower){
PWM = PWM-INC;
}
if(newpower > oldpower && direction == UP && PWM < MAX){
PWM = PWM+INC;
}
else if(newpower > oldpower && direction == DOWN && PWM > MIN){
PWM = PWM-INC;
}
if(newpower < oldpower && direction == UP){
PWM = PWM-INC;
direction = DOWN;
}
else if(newpower < oldpower && direction == DOWN){
PWM = PWM+INC;
direction = UP;
}
oldpower = newpower;
}Подскажите пожалуйста, что делать - я сейчас даже не понимаю, как тут отлаживать, пока пришел только к варианту разбирать отдельные циклы, делая явную проверку мощности и подавая результат на какую-нибудь тестовую ногу... Сейчас возможности физически проверить несколько дней нет, но может у меня в принципе что-то неправильно сделано и я просто по своему нубству этого не вижу?
Частота МК 8MHz (через фьюз), предделитель восьмибитного таймера 128, предделитель таймера управляющих импульсов 1, предделитель АЦП 64.

