Например TDA7294

Форум РадиоКот :: Просмотр темы - ATtiny2313 и симистор
Форум РадиоКот
https://radiokot.ru/forum/

ATtiny2313 и симистор
https://radiokot.ru/forum/viewtopic.php?f=57&t=138531
Страница 1 из 2

Автор:  melandr [ Ср ноя 23, 2016 22:38:23 ]
Заголовок сообщения:  ATtiny2313 и симистор

Доброй ночи, уважаемые коты. Такой вопрос. Вышел из строя регулятор оборотов гравировальной машины. После изучения схемы, так как китайцы затерли название контроллера, определил, что это скорее всего ATtiny2313. Решил методом реверс-инжиниринга восстановить этот регулятор. В принципе программа не сложная. Разобрался с работой ЖК индикатора. Индикация и управление кнопками работает. Но проблема. Подключил нагрузку, а симистор не открывается. Есть подозрение, что выбрал неправильный режим работы симистора. Так как рисовал схему по существующей плате. А управление симистором делал отрицательным импульсом.
Вот схема Изображение
а вот программа
Спойлер
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>
#include "button.h"

#define ZERO_CROSS PD2                //Вход импульсов ZERO-CROSS (INT0)
#define control_triac PD1               //Вывод на управляющий электрод симистора
#define v_change_speed 288             //Шаг регулировки изменения скорости
#define t_pulse_triac 50                //Длительность отпирающего импульса симистора 30 мкс (смотреть по ТУ для конкретного симистора)
#define SP_hi 9600                       // максимальная скорость
#define SP_lo 1824                       // миниимальная скорость
#define SP_m 4992                       // средняя скорость

#define COM1  PD3
#define COM2  PD4
#define SEGA  PB0
#define SEGB  PB1
#define SEGC  PB2
#define SEGD  PB3
#define SEGE  PB4
#define SEGF  PB5
#define SEGG  PB6

unsigned char segs_out = 0;
volatile unsigned char state_counter = 4;
volatile unsigned char output_change = 0;
unsigned char LCD_out[2] = {0, 0};
unsigned char count;

const unsigned char segment_table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
unsigned long speed_lcd;
volatile unsigned int speed;

//************************ Функция инициализации ***********************
void initialization(void)
{
   DDRB = 0x7F; //7 выходов сегмента

   DDRD |= _BV(control_triac);        //выход управляющего электрода
   PORTD |= _BV(control_triac);      //высокий уровень на управляющем выводе
   DDRD &= ~_BV(ZERO_CROSS);          //вход детектора нуля
   PORTD |= _BV(ZERO_CROSS);          //с подтягивающим резистором для питания транзистора оптрона

   MCUCR |= _BV(ISC00);               //внешнее прерывание 0 по любому изменению уровня
//    GIMSK |= _BV(INT0);                 //разрешаем внешнее прерывание 0

   // Инициализация Timer/Counter 0
   TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00); // = 8МГц/64
   TCNT0 = 0xC1;

   TIMSK |= _BV(TOIE0)| _BV(OCIE1A);   //разрешаем прерывание таймера 0  и таймера 1

}

// Следующая таблица имеет 10 записей для отображения символов 0-9, HEX-значения COM1-COM4
// для входов LCD A & B.

void LCD_print(char digit, unsigned char data)
{
  if (digit == 1) LCD_out[0] = segment_table[data / 10];
  if (digit == 2) LCD_out[1] = segment_table[data % 10];
}

void LCD_update(void)
{
  output_change = 0;
  // state_counter генерирует сигналы 2 выходов COM через PORTD,
  // каждый имеет состояния HIGH и LOW.
  switch (state_counter)
  {
    case 0:
      //вывод десятков:
      PORTD &= ~((1 << COM1) | (1 << COM2)); //вывод в режиме Hi-Z
      DDRD &= ~((1 << COM1) | (1 << COM2)); //порт D пин 0 работает как ВХОД
      segs_out = LCD_out[0];
      PORTB = segs_out; //выводим в порт символ
      DDRD |= (1 << COM1); //порт D пин 0 работает на ВЫХОД
      DDRD &= ~(1 << COM2);
      break;
    case 1:
      PORTD |= (1 << COM1); //

      PORTB = segs_out ^ 0xFF;// инверсия выходов сегментов
      break;
    case 2:
      //вывод единиц
      PORTD &= ~((1 << COM1) | (1 << COM2)); //вывод в режиме Hi-Z
      DDRD &= ~((1 << COM1) | (1 << COM2)); //порт D пин 0 работает как ВХОД
      segs_out = LCD_out[1];
      PORTB = segs_out;
      DDRD |= (1 << COM2); //порт D пин 0 работает на ВЫХОД
      DDRD &= ~(1 << COM1);
      break;
    case 3:
      PORTD |= (1 << COM2); //
      PORTB = segs_out ^ 0xFF; // инверсия выходов сегментов
      break;
    default:
      DDRB = 0x00;
      DDRD &= ~((1 << COM1) | (1 << COM2)); // COM1-COM2 отключены (входы)
  }
}

//********************* Обработчик прерывания по переполнению Timer 0 ***************
ISR(TIMER0_OVF_vect)
{
   // Перезагрузка значения для Timer 0
   // Период Timer0 = 0.125 МГц = 8 МГц / 64.
   // 2 мс = 8 мкс * 250
   // 5 = 255-250
   TCNT0 = 5;
   state_counter++;
   output_change = 1; // Это флаг для цикла main
   if (state_counter > 3)
   state_counter = 0;

   BtnExe();
}

//********************* Обработчик внешнего прерывания 0 *****************************
ISR (INT0_vect)                        //По переднему/заднему фронтам импульса ZERO-CROSS
{
    OCR1A = 10000 - speed;                //Регистру сравнения присваиваем значение скорости
   TCCR1B |= _BV(WGM12) | _BV(CS10);   //Запускаем таймер 1 в режиме СТС с периодом счёта 1 мкс
}

//********************* Обработчик прерывания по сравнению Timer 1 *******************
ISR (TIMER1_COMPA_vect)                 //прерывание для формирования открывающего импульса симистора
{
    PORTD &= ~_BV(control_triac);        //Передний фронт отпирающего импульса симистора
    _delay_us (t_pulse_triac);          //Длительность отпирающего импульса
    PORTD |= _BV(control_triac);       //Задний фронт отпирающего импульса симистора
   TCCR1B = TCNT1 = 0;                 //остановка и обнуление таймера 0
}

int main (void)
{
   // Вызов функции инициализации (описание см. ниже):
   initialization();
   BtnInit();
   speed = SP_lo;                    //скорость на середину диапазона
   // Разрешить все прерывания:   
   sei();                             
   while(1)
   {
      uint8_t button = BtnGet();            //читаем значение кнопок

      if (!(BTN_PIN & BTN_POWER))            //если нажата кнопка POWER
      {
          GIMSK |= _BV(INT0);                 //разрешаем внешнее прерывание 0
         TIMSK |= _BV(OCIE1A);            //разрешаем прерывание таймера 1
      }
      if (BTN_PIN & BTN_POWER)               //если отжата кнопка POWER
      {
         GIMSK &= ~_BV(INT0);               //запрещаем внешнее прерывание 0
         TCCR1B = TCNT1 = 0;         
         TIMSK &= ~_BV(OCIE1A);            //запрещаем прерывание таймера 1
          PORTD |= _BV(control_triac);
      }
                  
      if (button == BTN_SHRT_UP)            //если нажата кнопка +
      {
         speed += v_change_speed;      //увеличиваем скорость с заданным шагом
         if(speed > SP_hi) speed = SP_hi;//не выходя за пределы
      }

      if (button == BTN_SHRT_DOWN)      //если нажата кнопка -
      {
          speed -= v_change_speed;      //уменьшаем скорость заданным шагом
         if(speed <= SP_lo) speed = SP_lo;//не выходя за пределы
      }            

      speed_lcd = ((unsigned long)speed + 480) * 27 / 7776;
      LCD_print(1, speed_lcd);
       LCD_print(2, speed_lcd);
       if (output_change)
       {
         LCD_update();
       }
   }
}

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

Автор:  Z_h_e [ Ср ноя 23, 2016 22:47:29 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Думаю, что открывается при любом выходном состоянии порта, но лучше 0, а "закрывается" когда выход МК в Z состоянии.
Цитата:
Вышел из строя регулятор оборотов гравировальной машины.
Симистор то исправный?

Автор:  melandr [ Ср ноя 23, 2016 22:56:51 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Да симистор исправный, есть приборчик MG328 - многофункциональный тестер, к нему симистор подключил. Показывает что это симистор. Почитал мануалы по симисторам. Написано, триак может управляться как положительным, так и отрицательным током между затвором и T1. Только я не могу понять какой у меня ток между управляющим электродом и Т1. По схеме Т1 подключен к "-" микроконтроллера. Тогда логично будет давать положительный импульс на управляющий электрод.
Изображение
Не понятно в каком сейчас квадранте и в каком должно быть?

Автор:  Z_h_e [ Ср ноя 23, 2016 23:07:54 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

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

Автор:  Enman [ Чт ноя 24, 2016 00:31:02 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Что стабилизатор +5 неправильный, что управление симистором...
Это схема "регулятор Насти"...
Изображение
Симистор открывается нулём (30 мкс для экономии энергии питания, хотя в режиме
100% 0 постоянный и тоже хватает) относительно +5...
(в стиралках - нулём от +12 и никто "квадранты" не применяет...)
====
Вариантов управления 2 : минусовым током относительно Т1 или током от Т2 (как с опто).

Автор:  melandr [ Чт ноя 24, 2016 08:23:41 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Почему стабилизатор +5 - неправильный? Индикатор и микроконтроллер работают. Не работает только симистор.

Автор:  Enman [ Чт ноя 24, 2016 12:28:31 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Да, извиняюсь за стабилизатор...(не заметил, что там стабилитрон, а не диод)...
(резисторы на сегменты индикатора есть в реале ?)

Автор:  melandr [ Чт ноя 24, 2016 15:03:01 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Да, схема один в один. Вроде нашел ошибку. Спасибо Enman за схему. Резисторы только те, которые на схеме. Индикатор же ЖК. Вечером приеду с работы, перепаяю и проверю. Вот брошу исходную схему, по которой делался реверс-инжиниринг
Изображение
Я вывод Т1 симистора подключил к "минусу" блока питания, а не к "плюсу". Поэтому скорее всего симистор и не открывался. Нужно одну дорожку перерезать и подпаять на другой вывод конденсатора блока питания.
Еще такой вопрос немного не по теме. ЖК индикатор, используемый в регуляторе, не имеет маркировки. Есть такой апноут AVR340: прямое управление сегментами ЖКИ с помощью портов GPIO Я по аналогии с этим апноутом сделал 2 мс период отображения каждого сегмента. Но при работе заметно мерцание сегментов соседних разрядов. то есть допустим вывожу число 12. На первом разряде четко видно цифру 1 и мерцают сегменты от разряда 2. Сначала частота была 500 Гц, мерцание было сильное. Сейчас сделал частоту 30 Гц, мерцание заметно, но уменьшилось. Может кто знает, с какой частотой нужно выводить символы на индикатор. Получается такая ситуация, что не успевают тухнуть сегменты соседнего разряда за период обновления. А так как используется таймер/счетчик 0, то не получается получить частоту при 8 МГц меньше 30 Гц. Без использования бита CKDIV8.

Автор:  Enman [ Чт ноя 24, 2016 15:58:48 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Про частоты не скажу, но ЖКИ надо питать напряжением с постоянной сменой полярности
во время индикации : разряд(сегмент) погашен - синфазное изменение напряжения на сегментах,
разряд отображает - противофазное изменение напряжения на включённых сегментах....

Автор:  melandr [ Чт ноя 24, 2016 19:01:07 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Так и есть, я выше код показал. правда пока с частотой не разобрался.
Отключил вывод симистора Т1 от "минуса" и подключил к +5В. Что-то даже индикация перестала работать. Может нужно еще что-то переподключить. Непонятка с этим симистором.

Автор:  Enman [ Пт ноя 25, 2016 04:21:43 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

А питание +5 не пропало ?... :) (минус 5 повисло в воздухе)
В исходной схеме было правильно, а желание улучшить - и в результате "как всегда"....)
(Так что питание таки было неправильным, просто по другой причине. )
Или перейти на опторазвязку, там заморочек меньше, и схема целее в случае чего...

Автор:  melandr [ Пт ноя 25, 2016 15:31:36 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

:) Так и есть минус повис в воздухе, решил переносить два провода.

Автор:  Enman [ Пт ноя 25, 2016 15:54:22 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

а будет правильно ? или после бабаха возникнут новые вопросы ?...))))

Автор:  melandr [ Пт ноя 25, 2016 22:07:23 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Да должно быть правильно, я нашел похожую схему на одном из сайтов

Вложения:
PhaseControl.PDF [216.24 KiB]
Скачиваний: 194

Автор:  Enman [ Пт ноя 25, 2016 23:21:22 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

правильные схемы в теме нарисованы....или вы на опторазвязку решили перейти ?

Автор:  melandr [ Пт ноя 25, 2016 23:48:20 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

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

Автор:  Enman [ Сб ноя 26, 2016 00:07:55 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

так тоже неправильно...в таком варианте надо транзистор ставить в цепь УЭ...
Исходная схема рабочая, что заставляет вас её как-то изменять с внесением ошибок ?...
melandr писал(а):
был немного замудренный стабилизатор напряжения

Просто ровнее надо рисовать... :)
Изображение

Автор:  melandr [ Сб ноя 26, 2016 11:08:02 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

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

Автор:  Полосатый [ Пн ноя 28, 2016 06:32:29 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Я бы опторазвязал ... так как на "схеме реле", которую тут Amgor выложил:
http://www.radiokot.ru/forum/viewtopic. ... &start=400
(предпоследний пост на этой странице).

Автор:  melandr [ Чт дек 22, 2016 16:18:13 ]
Заголовок сообщения:  Re: ATtiny2313 и симистор

Добрый день. Уже мозг взрывается от этой схемы управления симистором. Подключил по этой схеме
Изображение
Подал питание. Подключил в нагрузку лампочку 40 Вт. Лампочка не светится. Показания на ЖК индикаторе отображаются, кнопками регулируется ШИМ. Осциллографом не проверял, так как боязно на 220 садится. Понимаю, что с бестрансформаторным блоком питания и микроконтроллером все норм, есть проблема в управлении симистором. Тут возникает "умная" мысль программно установить на управляющем электроде низкий уровень сигнала. Задумано и делаем. В прерывании где создается импульс управления симистором комментируется пара строчек, чтобы на управляющем электроде был постоянно низкий уровень. При включении в сеть происходит фейерверк. Отключаем питание и смотрим, что же дымилось. Отгорел один вывод на гасящем конденсаторе 0,68 мк 400В. и дорожка, которая идет к минусу блока питания. Подключаем контроллер к программатору, контроллер живой. Возникает вопрос. почему произошел фейерверк?
Вот нашел еще пару схем подключения симистора к контроллеру без опторазвязки. Не могу понять, отличаются ли они от моей схемы.
Изображение
Изображение
Я в PICax не разбираюсь, потому не понятно каким напряжением открывается симистор в этих схемах. И что в моей схеме не правильно? Заранее благодарен за помощь

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/