MPPT на ATMega8

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Сб май 18, 2013 13:14:16

Сообщение GeoffreyAshe »

Добрый день. Делаем студенческую работу, один из элементов которых - реализация MPPT режима на контроллере ATMega8. Прошу помощи, т.к. практические результаты разошлись с теорией (и эмуляцией).

Пришел примерно к следующему - управляющие импульсы МК выдает частотой ~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;
		}
	}
}
В результате на экране осциллографа КЗ постоянно убывает в одну сторону (доходит до нуля, переполняется и опять убывает), не делая никаких попыток что-то поискать. Эмуляцию я делал в Proteus Isis 7, там алгоритм отрабатывал правильно, со скидкой на то, что там показания на каналах АЦП я менял вручную во время эмуляции. Все переменные объявлены volatile, и если верить эмулятору, записываются правильно. Я сначала думал, что мой алгоритм неправильный (хотя блок-схемам вроде соответствует), поискал в интернете готовый, нашел вот этот:

Код: Выделить всё

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.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Когда делал MPPT я столкнулся с похожими трудностями.
1. АЦП атмеги может шуметь как паровоз. Надо делать усреднение N выборок. Я брал 2^N выборки, чтобы обойтись простым сдвигом вправо вместо деления.
2. От датчика тока многое зависит. Мы например брали ACS756, у них по документации гистерезис до 1%. Что на практике сводило с ума алгоритм. Пришлось ввести "цифровой гистерезис" в N попыток для смены направления ШИМ. Но это ухудшало точность поиска.
3. Точности/разрядности 10 бит АЦП не хватало для отлова истинного максимума. Частично виноват датчик(он на 50А и точность на малых токах соответственная).
4. 8 бит таймера не хватало. Я наблюдал на осцилле, как MPP была между двумя "ступеньками" таймера. А между ними моща гуляла прилично. Дело в том, что эти 8 бит размазываются по всему диапазону. А DC-DC обычно работоспособен в намного более узком диапазоне ШИМ.
5. Для отлова MPPT не надо и даже вредно считать полную мощность P=IU. Достаточно знать ток с выхода преобразователя на нагрузку. Это упрощает расчет и уменьшает погрешность вычислений и влияние прочих факторов.

Мы проверили два типа алгоритма:
1)непрерывный поиск
2)цикл поиска - задержка(10-20мин) - снова поиск.
Второй вариант показал себя с лучшей стороны.

Ну вот, кажется все ноу-хау.
и изменение КЗ


КЗ - короткое замыкание???

Код: Выделить всё

       //:: Если оно меньше или равно предыдущему, то...
То надо записать вот так:

Код: Выделить всё

        else //if(Power < Power_Prev)
         {
         //:: Шагаем в другую сторону
            if(OCR1A>MIN)
                OCR1A = (OCR1A - MPPT_DC_Step);      
         }
Реклама
Родился
Сообщения: 2
Зарегистрирован: Сб май 18, 2013 13:14:16

Сообщение GeoffreyAshe »

uk8amk, огромное вам спасибо за то, что поделились опытом! Усреднение по выборкам предлагал как раз мой напарник по проекту, но я в эту сторону не слишком смотрел. Теперь обязательно попробую проработать это направление.
В качестве датчика тока мы используем ASC712, и к нему действительно с нашей стороны есть много вопросов (хотя может быть некоторые возникают исключительно по неопытности).
Спасибо про хинт про расчет, не задумывался. Как только появится возможность все проверить на оборудовании, обязательно отпишу о результатах!
КЗ - короткое замыкание???
В данном случае я имел в виду коэффициент заполнения, основной параметр, который мы с товарищем пытаемся регулировать.
Про код тоже спасибо, я сам заметил, что определенную долю времени (значительную) система проводит в состоянии "ни то условие, ни другое". Нужно будет поглубже проработать этот момент.
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

И еще. Очень удобно настраивать и проверять в полевых условиях если вывести real-time график(P-t, I-t) на монитор компа. Преподы тоже это очень любят.

Кстати, слово "(Currency)" переводится как "валюта". Правильней было бы "current".
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»