Стабилизатор сетевого напряжения на ATMEGA32

Раздел начинающих пользователей
Правила форума
В песочнице можно спрашивать когда незнаешь где спросить.
В песочнице нелзя посылать в гугл
В песочнице можно задавать любой вопрос, но на него могут и неответить.
Песочница для тех, кто начинает свои вопросы с защиты чайников от пинков.
В песочницу будут перетаскиваться вопросы неполучившие ответа.
Песочница - попытка навести порядок.
На песочницу большие надежды.

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение viknik8 (viknik8) » 09 дек 2016, 11:37

Замечательно, конечно. Но хотелось бы полную схему и HEX, чтобы не рыться везде и не разбираться.
Ник: viknik8
Имя: viknik8
Новичок
Новичок
Информация о пользователе

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение tjalex (Александр) » 17 май 2017, 22:44

Три года пользования, работает. Прошивка с последних страниц форума. Из багов были только пару раз сбои в индикации(грешу на длинные провода к дисплею). Лечилось перезагрузкой. Но програмку забыл почти всю. Охота кое-что добавить, теперь придётся всё вспоминать.
Аватар пользователя
Ник: tjalex
Имя: Александр
(Чернигов)
Практик
Практик
Информация о пользователе

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение vit1471 (Vitaliy_KSM) » 16 янв 2018, 13:16

Доброго времени суток коллеги! Хочу поделиться эскизом печатки на стабилизатор, блок стабилизаторов и синхро, подключен обычный китайский LCD 1602A, правда что бы он корректно отображал инфу пришлось в блоках программы поковырять. Также снабдил шелкографией эскиз платы, все в лейаут.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось Vitaliy_KSM 17 янв 2018, 16:50, всего редактировалось 1 раз.
Аватар пользователя
Ник: vit1471
Имя: Vitaliy_KSM
(Кушмурун)
Новичок
Новичок
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение andrewproffi (Андрей) » 17 янв 2018, 08:39

не сдерживай себя! делись. :lol:
Аватар пользователя
Ник: andrewproffi
Имя: Андрей
(Томск)
Супер разработчик
Супер разработчик
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение hurricaud (hurricaud) » 19 сен 2018, 19:46

Всем привет!
Собрал данный девайс по схеме и коду vik3213, с небольшими изменениями в схеме (так как использовал готовый трансформатор с коммутацией по выходу, пришлось добавить отдельный БП для питания блока синхро). Спасибо уважаемому автору за помошь, девайс отлично работает! :!:
Но возникло желание немного доработать устройство. Так как девас находится в подвале, появилась идея удаленного мониторинга устройства по сети.
Примерно понятно, что нужно сделать, не совсем понятно как это лучше сделать. :lol:
Задача простая - это отправлять по сети 5 значений (Uвходное, Uвыходное, Мощность, Наличие ошибок, Состояние ключей.
Так как опыта в программировании у меня почти нет, прошу помощи у опытных людей, что бы направили в правильную сторону, как это лучше программно и аппаратно организовать. Что бы потом еще раз не переделывать:)
Пока в голове нарисовалась такая картинка.
В основном контроллере половина памяти еще свободна, но что бы не грузить основную программу хочу сделать вебсервер на отдельном контроллере и cоединить контроллеры по SPI.
Пока возникло несколько основных вопросов
1. Наскольно эффективен этот вариант ? Нужно ли вообще городить отдельный контроллер, web сервер или проще просто добавить в основной контроллер возможность отправки udp пакетов без подтверждения, а уже на конечном сервере это форматировать и приводить в красивый вид. Самое главное, решит ли проблему быстродействия основной программы?
2. Начал упражняться с SPI. Пока все успехи - это научился отправлять 1 байт со стабилизатора на дисплей другого контроллера. Но соответственно, одним байтом я не обойдусь и я так понимаю мне нужна функция которая будет раскладывать все на несколько байтов, последовательно эти байты отправлять, а другая функция на основном контроллере это будет принимать и трансформировать обратно в переменные. Наверняка уже есть куча готовых наработок по данной теме. Не могли былы поделиться кодом?
3. Так как и контроллер LAN и сами контроллеры будут интегрироваться по SPI, не пойму кого нужно делать мастером. Изначально думал сделать мастером сам стабилизатор а на слейв контроллер веб сервера, отправлять данные через прерывания, но в таком случае вебсервер не сможет управлять сетевой картой. Если делать мастером веб сервер, то тогда нужно сильно переделывать код стабилизатора, что бы не хотелось. Подскажите как лучше поступить?
Ник: hurricaud
Имя: hurricaud
Новичок
Новичок
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение hurricaud (hurricaud) » 10 окт 2018, 17:07

Для начала решил отточить протокол отправки и получения данных.
Стабилизатор решил сделать Slave, а Веб Сервер - Master, так как он еще и сетевой картой управляет.
Написал вот такой код в СИ и вчера попробовал реализовать все это в FC



Код Слейва, который потом пойдет в стабилизатор:
Код: выделить все
//--------------------


void SPI_init_SL(void)
{
DDRB |= (1<<PORTB6);//ножки SPI на выход
DDRB &= ~((1<<PORTB4)|(1<<PORTB5)|(1<<PORTB7));//ножки SPI на вход
SPCR = (1<<SPE);//включим шину,    включим прерывания -|(1<<SPIE)   // (1<<SPR0) x16 splitter
}
//------------------

unsigned char SPI_WriteRead(unsigned char dataout)
{
   // Put Slave Data On SPDR
   SPDR=dataout;
   
   
    for (unsigned long counter = 0; counter < 1000000L; counter++)
    {
       if (SPSR & (1<<SPIF))
       break;
    }
   
   // Return Serial In Value (MISO)
   return SPDR;
}
//
//-----------------

//-----------------
void SPI_Read_DataArray (void)
{
   
   // Poll the SPI Data
   
      datain=SPI_WriteRead(dataout);

   // Examining the state here
      switch(state)
      {
         case 0:
         // Check for STAB Slave Emulation OpCode
         if (datain == Stab_Write)
         {
            state=1;
            rwstat=1;      // Write
         }

         if (datain == Stab_Read)
         {
            state=1;
            rwstat=0;      // Read
         }
         
         break;
         case 1:
         // For STAB implemented registers, change the state
         if (datain == UIN || datain == UOUT || datain == PWR || datain == RLY || datain == ERR || datain == IP)
         {
            slavereg=datain;
            state=2;
            
         
            //  Read Condition - prepare for returning value on the next master cycle
            if (!rwstat)
            {
               dataout=0x00;

               switch(slavereg)
               {
                  
                  case UIN:
                  dataout= (uin >> 8);    //highByte 
                  break;
                  case UOUT:
                  dataout= (uout >> 8);
                  break;
                  case PWR:
                  dataout= (pwr >> 8);
                  break;
                  case RLY:   
                  dataout= (rly >> 8);     
                  break;
                  case ERR:
                  dataout= (err >> 8);   
                  break;
               }
            }
         }
         break;
         
         
         case 2:
         
         if (!rwstat)
         
         {
            state=3;
            dataout=0x00;

            switch(slavereg)
            {
               
               case UIN:
               dataout = (uin & 0xFF);  //lowByte
               break;   
               case UOUT:
               dataout= (uout & 0xFF);  //lowByte
               break;
               case PWR:
               dataout= (pwr & 0xFF);  //lowByte
               break;
               case RLY:
               dataout= (rly & 0xFF);  //lowByte
               break;
               case ERR:
               dataout= (err & 0xFF); //lowByte
               break;
            }
         }
         if (rwstat)  // Write
         
            if (rx_wr_index == 0)
            {
               rx_buffer_overflow = 0;
                write_enable = 1;
              }
            
            
            if (write_enable == 1)
            {
               rx_buffer[rx_wr_index++]= datain;
               
               if (rx_wr_index == RX_BUFFER_SIZE)
            {
               rx_wr_index=0;
               rx_buffer_overflow = 1;
            }
            
            
            if((rx_buffer_overflow == 1)&&(write_enable == 1))
            {
               write_enable = 0;
               rx_wr_index= 0;
                rx_buffer_overflow = 0;

            switch(slavereg)
            {
            /*   
               case UIN:
               uin=datain;  // Just put it on variable
               break;
               case UOUT:
               uout=datain;   // Just put it on variable
               break;
               case PWR:
               pwr=datain;   // Just put it on variable
               break;
               case RLY:
               rly=datain;   // Passing data to the real port
               break;
               case ERR:
               err=datain;   // Passing data to the emulation register
               break;
               */
               case IP:
               IP_buf[0]=rx_buffer[0];
               IP_buf[1]=rx_buffer[1];
               IP_buf[2]=rx_buffer[2];
               IP_buf[3]=rx_buffer[3];  // Passing data to the emulation register
               break;
            }
            dataout=0;
            state=0;
            rwstat=0;
            }
            
         }
         
         break;
         
      case 3:
      
         state=0;
         rwstat=0;
         break;
      }
}
//-----------------



Код Мастера:

Код: выделить все
void SPI_init(void)

{

   DDRB |= ((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //ножки SPI на выход
   
   DDRB&=~(1<<PORTB4);

   PORTB &= ~((1<<PORTB2)|(1<<PORTB3)|(1<<PORTB5)); //низкий уровень

   SPCR = ((1<<SPE)|(1<<MSTR) );//включим шину, объявим ведущим   
}
//----------------------


//---------------

void SPI_WriteIP(unsigned char addr, uint8_t num, uint8_t *data)
{

   // Activate the CS pin
   SPI_PORT &= ~(1<<SPI_CS);

   // Start Stab OpCode transmission
   SPDR = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E)| SPI_SLAVE_WRITE;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   _delay_ms(20);
   
   // Start Stab Register Address transmission
   SPDR = addr;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   _delay_ms(20);
   // Start Stab Register Data transmission
   
       while(num--)
       {
          SPDR = *data++;
          while(!(SPSR & (1<<SPIF)));
          _delay_ms(60);
       }
      
   // CS pin is not active
   SPI_PORT |= (1<<SPI_CS);
   }
//-------------------------------------

unsigned int SPI_Read(unsigned char addr)
{
   
   unsigned char hb = 0, lb = 0;
   unsigned int sum=0;
   
   // Activate the CS pin
   SPI_PORT &= ~(1<<SPI_CS);


      // Send Dummy transmission for reading the data
      SPDR = 0x00;
      // Wait for transmission complete
      while(!(SPSR & (1<<SPIF)));
      _delay_ms(20);
      
         
   // Start STAB OpCode transmission
   SPDR = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E)| SPI_SLAVE_READ;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   _delay_ms(20);

   // Start STAB Address transmission
   SPDR = addr;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   _delay_ms(20);
   

   // Send Dummy transmission for reading the data High Byte
   SPDR = 0x00;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   _delay_ms(20);
   
   hb= SPDR;
   
   // Send Dummy transmission for reading the data Low Byte
   SPDR = 0x00;
   // Wait for transmission complete
   while(!(SPSR & (1<<SPIF)));
   _delay_ms(20);
   
   lb= SPDR;   
      
   // CS pin is not active
   SPI_PORT |= (1<<SPI_CS);
   
   
   sum=(hb<<8)|lb;
   
   return(sum);
   
}


На Мастрере функция SPI_Read() отправляет запрос на чтение переменных со стабилизатора:
uin - входное напряжение
rly = состояние ключей
uout = выходное напряжение
pwr = мощность нагрузки
err = наличие ошибок

Шаг 1 - отправляется байт определяющий чтение/запись
Шаг2 - отправляется байт с определением в какую переменную будем писать
Шаг 3 - передаем highbyte
Шаг 4 - передаем lowbyte

Функция SPI_WriteIP отправляетданные об IP на стабилизатор, который потом можно будет вывести на экран.

В протеусе в проверил, все нормально работает, но хотелось бы узнать мнение более опытных товарищей, может можно как то оптимизировать код Слейва? Уж как то он размашистый получился.
И второй вопрос - как лучше забирать данные со слейва? Сейчас слейв сам подтягивает данные от мастера,+ есть счетчик который пропускает команду SPI, если мастер ничего не отправляет. Но так контроллеры обмениваются все время, в чем нет необходимости, хотелось бы сделать отправку по интервалам, например - каждую минуту. Если я делаю условие с таймером, то все вообще перестает работать, так как Мастер и слейв ни могут состыковаться по времени. Другой вариант это запрос через прерывания. Но самый главный вопрос здесь - на сколько это будет влиять на работу основной программы? Ведь замеры напряжения и сравнение у нас тоже запускается за счет прерывания. Не хотелось, что бы при получении запроса от вебсервера, стабилизатор вставал "колом"
Всем заранее спасибо за советы необразованному гуманитарию :!)
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось hurricaud 16 окт 2018, 12:51, всего редактировалось 1 раз.
Ник: hurricaud
Имя: hurricaud
Новичок
Новичок
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение hurricaud (hurricaud) » 16 окт 2018, 12:37

Сделал во flow code. Вроде бы работает. Другой вопрос, а можно ли сделать так, что бы веб-сервер переключал решим мастер/ слейв? Например по умолчанию он работает как мастер с сетевой картой, а на момент когда Стабилизатор начнет отправлять информацию, по наступлению прерывания по spi или по потенциалу на одном из входов, он переключится в слейв/ получит данные/ переключится обратно в мастер.
У вас нет доступа для просмотра вложений в этом сообщении.
Ник: hurricaud
Имя: hurricaud
Новичок
Новичок
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение hurricaud (hurricaud) » 16 окт 2018, 12:46

Макет в протеусе и прошивка мастера.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось hurricaud 18 окт 2018, 16:27, всего редактировалось 1 раз.
Ник: hurricaud
Имя: hurricaud
Новичок
Новичок
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение Вячеслав (Вячеслав) » 17 окт 2018, 04:36

hurricaud писал(а):Макет в протеусе и прошивка мастера.

И где это?
Аватар пользователя
Ник: Вячеслав
Имя: Вячеслав
(Саратов)
Разработчик
Разработчик
Информация о пользователе
Вернуться наверх

Re: Стабилизатор сетевого напряжения на ATMEGA32

Сообщение hurricaud (hurricaud) » 18 окт 2018, 16:36

Пардон, не заметил, что вложение дропнули.
Вчера похоже пришло оптимальное решение. Оказывается USART можно использовать в режиме SPI. Поэтому, хочу поднять на вебсервере второй SPI (usart), который будет управлять сетевой картой, а нативный SPI будет работать в режиме slavе и через прерывания получать данные от стабилизатора. Сегодня попробую переделать.
Ник: hurricaud
Имя: hurricaud
Новичок
Новичок
Информация о пользователе
Вернуться наверх

Пред.След.

Вернуться в ПЕСОЧНИЦА

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей