ATtiny2313 и симистор

Обсуждаем контроллеры компании Atmel.
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

ATtiny2313 и симистор

Сообщение melandr »

Доброй ночи, уважаемые коты. Такой вопрос. Вышел из строя регулятор оборотов гравировальной машины. После изучения схемы, так как китайцы затерли название контроллера, определил, что это скорее всего 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();
	    }
	}
}
Подскажите, что неправильно
Вот такой регулятор
Изображение
ЗЫ: И не понятно, в каком квадранте сейчас работает симистор. И в каком должен работать.
Последний раз редактировалось melandr Ср ноя 23, 2016 22:50:23, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: ATtiny2313 и симистор

Сообщение Z_h_e »

Думаю, что открывается при любом выходном состоянии порта, но лучше 0, а "закрывается" когда выход МК в Z состоянии.
Вышел из строя регулятор оборотов гравировальной машины.
Симистор то исправный?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: ATtiny2313 и симистор

Сообщение melandr »

Да симистор исправный, есть приборчик MG328 - многофункциональный тестер, к нему симистор подключил. Показывает что это симистор. Почитал мануалы по симисторам. Написано, триак может управляться как положительным, так и отрицательным током между затвором и T1. Только я не могу понять какой у меня ток между управляющим электродом и Т1. По схеме Т1 подключен к "-" микроконтроллера. Тогда логично будет давать положительный импульс на управляющий электрод.
Изображение
Не понятно в каком сейчас квадранте и в каком должно быть?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: ATtiny2313 и симистор

Сообщение Z_h_e »

Не думаю что будет какая-то разница, будет ли на выходе 5 В или 0 В на фоне 300В. Со схемой не ошиблись? Порт имеет пару защитных диодов и думаю именно они дают ограничение напряжение на порте пит+0,5В.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Enman
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Re: ATtiny2313 и симистор

Сообщение Enman »

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

Re: ATtiny2313 и симистор

Сообщение melandr »

Почему стабилизатор +5 - неправильный? Индикатор и микроконтроллер работают. Не работает только симистор.
Реклама
Enman
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Re: ATtiny2313 и симистор

Сообщение Enman »

Да, извиняюсь за стабилизатор...(не заметил, что там стабилитрон, а не диод)...
(резисторы на сегменты индикатора есть в реале ?)
Последний раз редактировалось Enman Пт ноя 25, 2016 04:39:29, всего редактировалось 1 раз.
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: ATtiny2313 и симистор

Сообщение melandr »

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

Re: ATtiny2313 и симистор

Сообщение Enman »

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

Re: ATtiny2313 и симистор

Сообщение melandr »

Так и есть, я выше код показал. правда пока с частотой не разобрался.
Отключил вывод симистора Т1 от "минуса" и подключил к +5В. Что-то даже индикация перестала работать. Может нужно еще что-то переподключить. Непонятка с этим симистором.
Enman
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Re: ATtiny2313 и симистор

Сообщение Enman »

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

Re: ATtiny2313 и симистор

Сообщение melandr »

:) Так и есть минус повис в воздухе, решил переносить два провода.
Enman
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Re: ATtiny2313 и симистор

Сообщение Enman »

а будет правильно ? или после бабаха возникнут новые вопросы ?...))))
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: ATtiny2313 и симистор

Сообщение melandr »

Да должно быть правильно, я нашел похожую схему на одном из сайтов
Вложения
PhaseControl.PDF
(216.24 КБ) 208 скачиваний
Enman
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Re: ATtiny2313 и симистор

Сообщение Enman »

правильные схемы в теме нарисованы....или вы на опторазвязку решили перейти ?
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: ATtiny2313 и симистор

Сообщение melandr »

Выше в теме показывал фото устройства. Я бы с удовольствием добавил опторазвязку. Но места не хватает и так дополнительно поставил LM7805 и конденсатор на выходе. Устройство будет стоять в корпусе гравировальной машины и контакта не будет с токоведущими частями. Тем более в исходной схеме опторазвязки не было. Просто был немного замудренный стабилизатор напряжения, потому и неправильно подключил симистор. Вот исходная схема устройства, восстановленная по плате
Изображение
а вот то что я хочу изменить.
Изображение
Enman
Друг Кота
Сообщения: 7774
Зарегистрирован: Сб янв 29, 2011 00:28:48

Re: ATtiny2313 и симистор

Сообщение Enman »

так тоже неправильно...в таком варианте надо транзистор ставить в цепь УЭ...
Исходная схема рабочая, что заставляет вас её как-то изменять с внесением ошибок ?...
melandr писал(а):был немного замудренный стабилизатор напряжения
Просто ровнее надо рисовать... :)
Изображение
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: ATtiny2313 и симистор

Сообщение melandr »

В исходной схеме стабилизатор был сделан правильно. Но силовой электрод Т1 симистора был подключен к "минусу" стабилизатора. Поэтому при подаче отрицательного импульса на управляющий электрод симистор не открывался.После просмотра старой платы регулятора оборотов, было замечено, что при изменении стабилизатора напряжения я допустил ошибку. В ней после гасящего конденсатора подключение было к "минусу" стабилизатора. А "плюс" стабилизатора был подключен к силовому электроду Т1 симистора.
Аватара пользователя
Полосатый
Друг Кота
Сообщения: 3163
Зарегистрирован: Чт мар 26, 2009 04:35:04
Откуда: Москва

Re: ATtiny2313 и симистор

Сообщение Полосатый »

Я бы опторазвязал ... так как на "схеме реле", которую тут Amgor выложил:
http://www.radiokot.ru/forum/viewtopic. ... &start=400
(предпоследний пост на этой странице).
Изображение (Аль Котоне, кот ещё тот, Cattus Sapiens)
Усы и хвост - мои документы.
Кот - авторитет! Скажет "Мяу!" - не поспоришь. (скажи мне "мяу" и я скажу кто ты)
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: ATtiny2313 и симистор

Сообщение melandr »

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

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