Перейти к содержанию

Оптимизация кода под atmega8 вопрос к знатокам


imran100

Рекомендуемые сообщения

Здравствуй уважаемые знатоки!

Нужна ваша помощь

Пытаюсь собрать инвертор 12 - 220 с ,так называемым, чистым синусом на atmega8. Есть готовое решение на Arduino nano соответственно на Atmega328. Пытался оптимизировать код под мегу 8 но поскольку я не программист у меня естественно ничего не вышло:)

 

На выходах PB1 PB2 должен быть ШИМ сигнал, на аналоговом входе ADC0 PC0 считываются данные заряда аккумулятора (для защиты от глубоково разряда), на аналоговом входе ADC1 PC1 считываются данные выходного напряжения. (220 В), так же есть защита от кроткого замыкания... в общем полезная вещЧЬ.

Я так понимаю у меги 8 и 328 отличаются названия некоторых регистров и битов

Например:

У меги 8 есть только один регистр TIMSK а на меге 328 их 3, так же отличаются названия некоторых битов.

Второй и третий бит регистра TCCR1A у меги 328 зарезервированы а у меги8 нет, и т. д.

Вот сам код:

// Sine wave inverter with feedback control
// Design by Youtube:  ElectroMux
// https://www.facebook.com/groups/889800674889268

int i = 0;
int x = 0;
bool OK = 0;
#define led_on digitalWrite(2, HIGH)
#define led_off digitalWrite(2, LOW)

float h = 0;
int volvalue=0;
int battvalue=1024;
int temp=0;
int sinPWM[] = {0, 16, 32, 48, 65, 81, 97, 113, 129, 145, 161, 177, 192, 208, 224, 239, 255, 270, 286, 301, 316, 331, 346, 361, 376, 390, 405, 419, 434, 448, 462, 475, 489, 503, 516, 529, 542, 555, 567, 580, 592, 604, 616, 628, 639, 651, 662, 672, 683, 693, 704, 714, 723, 733, 742, 751, 760, 768, 777, 785, 793, 800, 807, 814, 821, 828, 834, 840, 845, 851, 856, 861, 865, 870, 874, 877, 881, 884, 887, 890, 892, 894, 896, 897, 898, 899, 900, 900, 900, 900, 899, 898, 897, 896, 894, 892, 890, 887, 884, 881, 877, 874, 870, 865, 861, 856, 851, 845, 840, 834, 828, 821, 814, 807, 800, 793, 785, 777, 768, 760, 751, 742, 733, 723, 714, 704, 693, 683, 672, 662, 651, 639, 628, 616, 604, 592, 580, 567, 555, 542, 529, 516, 503, 489, 475, 462, 448, 434, 419, 405, 390, 376, 361, 346, 331, 316, 301, 286, 270, 255, 239, 224, 208, 192, 177, 161, 145, 129, 113, 97, 81, 65, 48, 32, 16};
void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(12, INPUT);
  cli();
  TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
  TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
  TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
  TCNT1=0x00;
  ICR1=900;
  OCR1A=0x00;
  OCR1B=0x00;
  sei();
}
ISR(TIMER1_OVF_vect) {
  
  if (i > 175) {
    i = 0;
    OK = !OK;
    if(OK==0) TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
    else      TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
    
    if(volvalue>512 && h>0.1)  h-=0.01;
    if(volvalue<512 && h<0.99) h+=0.01;
    battvalue=analogRead(A0);
  }

  x = h * sinPWM[i];
  i = i + 1;
  if (OK == 0) {
    OCR1A = x;
  }
  if (OK == 1) {
    OCR1B = x;
  }
  if(i==150)
  {
    volvalue=analogRead(A1);
  }
}

void loop() {
  if(digitalRead(12)==LOW) 
  {
    while(digitalRead(12)==LOW){}
    Serial.print("Button press");
    Inverter();
  }



}
 int Inverter()
{
  temp=0;
  battvalue=1024;
  led_on;
  h=0.1;
  TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
  TIMSK1=0x01;
  OCR1A=OCR1B=0x00;
  while(1)
   {
    if(battvalue<575)   //Low batt protect
    temp++;
    else temp=0;
    if(temp>10)
    {
      TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
      TIMSK1=0x00;
      OCR1A=OCR1B=0x00;
      while(1)
      {
        led_on;
        delay(200);
        led_off;
        delay(200);
        if(digitalRead(12)==LOW) 
        {
          while(digitalRead(12)==LOW){}
          Inverter();
        }
      }
    }

    if(digitalRead(12)==LOW)  // Button off
        {
          while(digitalRead(12)==LOW){}
          led_off;
          while(1)
          {
            TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
            TIMSK1=0x00;
            OCR1A=OCR1B=0x00;
            if(digitalRead(12)==LOW) 
            {
              while(digitalRead(12)==LOW){}
              Inverter();
            }
          }
        }
     if(h>0.99 && volvalue<100)  //Short protect
        {
          digitalWrite(3, HIGH);
          TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
          TIMSK1=0x00;
          OCR1A=OCR1B=0x00;
          while(1)
          {
            led_on;
            delay(200);
            led_off;
            delay(200);
            if(digitalRead(12)==LOW) 
            {
              while(digitalRead(12)==LOW){}
              Inverter();
            }
          }
       }
   }
   
}

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

https://www.facebook.com/groups/889800674889268 

ElectroMux- 500W sine wave inverter with auto voltage.zip

А мне  бы  под Aurdino  Uno  помоему должно пойти тоже  :umnik2: 

Хотя Нано  , чудній моуль  :friends:

Изменено пользователем Нэцкэ

У меня есть мысль , и я её думаю ...  

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

54 минуты назад, Нэцкэ сказал:

Но схема как то  недаоскзанная  или я ее понять не могу  :umnik2:

Schematic_001_2.jpg.ab52e58c648871c252106cd9990d5942.jpg

У Вас правильная схема только она неудобная для новичка. Что касается кода то ничего менять не нужно. Просто выберите в arduino IDE свою плату и загрузите туда этот скетч. Я постараюсь нарисовать более понятную схему под arduino uno вечером постараюсь её загрузить.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

22 часа назад, imran100 сказал:

У Вас правильная схема только

...только нарисована она по-дурацки. Я, например, не сразу заметил, что отрицательный обкладки C1 и C2соединяются не только с U1 и U2.

И кстати, разве можно так соединять входы драйверов? Наверное, надо выходы соединить с диагональными ключами, а не с одним полумостом. Или HIN первого соединить с LIN второго и наоборот.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

В 22.01.2023 в 11:45, imran100 сказал:

Есть готовое решение на Arduino nano соответственно на Atmega328.

Мда... крутое решение...

int i = 0;
int x = 0;
float h = 0;
int sinPWM[] = {0, 16,

x = h * sinPWM[i];

перемножать в прерывании переменную с плавающей точкой на знаковое целое и присваивать значение знаковому целому это супер гениальное  решение.... этот быдло-код хотя бы в компиляторе собирается????

Ссылка на комментарий
Поделиться на другие сайты

Ну  да .. только что мне подвать  на контакт FB   при тесте  ?  

Я пока   хочу  только осликом  глянуть что у него на пинах выходных  будет  творится :blush:

У меня есть мысль , и я её думаю ...  

Ссылка на комментарий
Поделиться на другие сайты

Я ещё  разобраться не пытался   .сори  ... :blush: 

Там  ещё два порта замкнуты   D 12 - D13 :excl:

Изменено пользователем Нэцкэ

У меня есть мысль , и я её думаю ...  

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, COKPOWEHEU сказал:

Наверное, надо выходы соединить с диагональными ключами, а не с одним полумостом. Или HIN первого соединить с LIN второго и наоборот.

Чтобы сбой в программе не убил все ключи, подключать нужно именно так, как нарисовано, только драйвер нужен другой, со встроенным инвертором и задержками включения. И вход у них, обычно, один.

Ссылка на комментарий
Поделиться на другие сайты

И все  же  , можно ли соеденять как показано в схеме  два порта  вместе   D12  и  D13   вместе на кнопку  :excl:

У меня есть мысль , и я её думаю ...  

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, imran100 сказал:

Нэцкэ, держите схемку...

R1 подключен к +12В. Не слишком рискованно для PB4? Диодный мост, стоящий в цепи измерения, стОит развернуть или нет? AVR не умеют измерять отрицательное напряжение. 

Ссылка на комментарий
Поделиться на другие сайты

Я не супер схемотехник в аналоговой технике, но с чего вы называете эту схему "чистым синусом"?? тут нет ничего, что даст!
и ШИМ тут не особо помощник... Сама обмотка трансформатора сглаживает?

Авторы ТЗ, с которыми я работаю, не имеют права жаловаться на дороги, ЖКХ, бюрократию и правительство.

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, Гость_Григорий_Т. сказал:

Чтобы сбой в программе не убил все ключи, подключать нужно именно так, как нарисовано, только драйвер нужен другой, со встроенным инвертором и задержками включения. И вход у них, обычно, один.

Зачем еще усложнять, если с контроллера и так идет ШИМ с мертвым временем? Просто надо не левый-правый полумост включать, а одну или другую диагональ.

9 часов назад, imran100 сказал:

Нэцкэ, держите схемку

Только она неправильная. Ни драйверы ключей не исправлены, ни выходы полумостов не подключены. О чем я говорил еще про прошлую схему: нарисовано по-дурацки, вот и вы сейчас на это попали. Нижние обкладки конденсаторов C2, C3 должны быть подключены не только к драйверу.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Гость_Григорий_Т. сказал:

Затем, чтобы при любом сбое программы не вылетели все 4 полевика.

Вы можете внятно сформулировать какова же должна быть ситуация чтобы "вылетели все 4 полевика" в схеме с аппаратным ШИМом и либо объединением HIN-LIN разных драйверов, либо когда каждый драйвер управляет своей диагональю?

Потому что, похоже, мы вообще в разных контекстах разговариваем.

Я предлагаю исправить ту схему, что есть. Не искать другие драйвера, просто подключить так, чтобы оно могло работать. ШИМ, естественно, аппаратный, на таймере TIM1 - у него можно и частоту задать, и мертвое время - и он будет работать даже если ядро где-то зависнет. Разумеется, это не слишком поможет, поскольку регулировки не будет, но хоть от сквозного тока защита. К тому же в процессе работы вряд ли придется менять частоту, а OCR1A / OCR1B задаются по достаточно простой формуле, в которой достаточно не накосячить.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

29 минут назад, COKPOWEHEU сказал:

какова же должна быть ситуация

Самая простая, когда PB1 и PB2 выдадут две единицы. А чтобы ШИМ стал аппаратным, его ещё инициализировать нужно.

Ссылка на комментарий
Поделиться на другие сайты

Когда PB1 и PB2 выдадут синхронные сигналы откроются либо верхние, либо нижние ключи одновременно. Но это не приведет к ба-баху ключей, просто обмотка тр-ра будет зашунтирована либо верхними, либо нижними ключами. Была когда-то мысль, делал я систему фазовой модуляции на Атмеге. Ключики слегка подогревались (возможно что-то недорасчитал), а зато какой чистый сигнал шел с трансформатора - загляденье.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...