Прошивка attiny2313 + тиристор bt136

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

Всем привет. Делаю регулятор мощности для кухонной вытяжки на attiny2313 ,тиристор BT136 подключен через MOC3041 к portb , переход через 0 ловлю через int0 от 220 через 1 мом, прошивку буду делать на asm возникли вопросы:

Помогите с написанием прошивки!!!

1 как только поймал начало полуволны я должен для полной мощности сразу подать 1 на MOC3061, для минимальной с задержкой, длина полуволны на сколько я знаю 10мс, что делать со второй половиной полуволны???


допустим мне надо получить 50% мощности

обработка прерывания INT0 положительного перепада полуволны

int0: in r1,SREG

//далее надо я думаю запустить таймер T1 , сколько мс не пойму ,я думаю что половину от 10мс

TCNT1H = ????
TCNT1L = ????
TIMSK=0x82 //разрешение прерывания по переполнению T1


out SREG,r1


обработка прерывания TIM1 (включение симистора)


TIM1:

in r1, SREG
ldi r2, 0b00000001
out portb, r2 //включить симистор

out SREG,r1
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

малово-то исходных данных
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности

зы:
конструкция

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

ldi r2, 0b00000001
работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

to aleks_bmw528:
если верно понял, то предполагается применить фазовую регулировку мощности. Для этого не нужно применять МОС. Он включает только при переходе через 0. А Вам нужна фазовая регулировка, т.е. включение тиристора через определенное время после перехода через 0, в зависимости от требуемой мощности. Делаем так: ловим переход через 0 - в данном случае INT0; в обработчике прерывания последнего запускаем таймер на время, зависящее от требуемой мощности(больше мощность - меньше время); по истечении времени даем импульс! включения симистора и заряжаем этот же таймер на 10 мс для ловли второй полуволны; по истечении этих 10 мс даем опять же импульс на включение симистора. И далее в цикле повторяем.
зы: фазовая регулировка скорости вращения двигателя в вытяжке - весьма сомнительное занятие...
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

схему нарисовал

извиняюсь за код ldi r2, 0b00000001 это я на скоряк писал
частота 4МГц !


MOC3021 решил применить чтобы не использовать
выходные порты проца ,ток открытия симистора около 100ма и
придется использовать четыре порта что не хотелась бы , а во вторых развязка отдельно помоему лучше , но я не уверен что если использовать MOC3021 через транс ,а ловить 0 через сопротивление
1МоМ напрямую к 220 ,будет работать корректно ????

MOC3021 не реагирует на 0 MOC3041 реагирует!!!


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


.equ	Volna	=0

INT0:	in	R0,sreg
            TCNT1H = ????  //допустим 3мс 
            TCNT1L  = ???? 
            Timsk    = 0x82
            Volna = 0
            out	
            sreg,R0
            reti  

с таймером никак не разберусь ???  

TIM1:	in	R0,sreg
	сbi	R18,0b00000001
	sbr	R18,0b00000001
            out	PORTB,R18
            // насколько я понял дозаряжаем таймер прямо сдесь на 10мс
               или 10мс - 3мс 
            TCNT1H = ????  //???мс  не пойму 
            TCNT1L  = ???? 

// дальше  я что-та  впал в ступор  не знаю что дальше ведь надо  я 
так понял убрать импульс после 10 мс подождать 3мс и дать снова импульс  ?????       

            cpi volna , 0  //помоему не правильно забыл  cpi Rd,k 
            brne end 
            Timsk    = 0x02 //запрет прерыв
 

            volna ,1
end:   
            out	sreg,R0
            reti  


вопрос!!! к pyzh_man почему надо заряжать таймер на 10мс если он уже отработал как бы 3мс ведь полупериуд = 10мс, или я не так что то понял ???
Вложения
dim.jpg
схема тут
(47.8 КБ) 1329 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 641
Зарегистрирован: Пт ноя 28, 2008 20:34:39
Откуда: Краматорск

Сообщение headshotbacs »

GP1 писал(а):малово-то исходных данных
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности

зы:
конструкция

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

ldi r2, 0b00000001
работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
Полностью согласен. Но ничего нет страшного в этом регуляторе. Самое главное ПИШИТЕ и мы ПОМОЖЕМ!!! 8)
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

немного к пояснению работы регулятора
график-1:
если отлавливать только переход из - в + , то семистор отработает положительную полуволну и отключится, и как следствие больше 50% мощности не получить в принципе.
для исключения этого недостатка и производится повторный запуск через 10 мс график-2.
Вложения
-1.JPG
(62.81 КБ) 1202 скачивания
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

добавка.

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

1. определить момент перехода через 0
2. отработать задержку ХХ мс
3. выдать упр. напряжение на МОС
и т.д.

когда ты это сделаеш, все встанет на свои места.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

В начальном посте был указан MOC3041... :roll:
По схеме: если уж решено изолировать низковолтьную часть, то надо синхронизироваться от выпрямительного моста, отключив резистор от сетевого провода и подключив его к выпрямительному мосту. И уменьшить его номинал.
По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

2GP1 :beer:
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

и еще по схеме:
bt136 не является highcom семистором и поэтому при работе на индуктивную нагрузку, какой и является двигатель, необходимо шунтировать демпфирующей RC цепочкой (номиналы я не помню) для ограничения скорости нарастания тока через семистор.
Последний раз редактировалось GP1 Ср ноя 18, 2009 10:17:11, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Генеральный секретарь МЯУ
Аватара пользователя
Сообщения: 18887
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.

Сообщение SeregaT »

pyzh_man писал(а):По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.
ИМХО удобнее пропустить переменку через диодный мост и ловить синхроимпульс на каждой полуволне.
Алгоритм такой:
1: Ожидаем перехода через ноль.
2: Делаем задержку от 1 до 9 мс (вот эту задержку и надо регулировать).
3: Даём импульс на включение тиристора.
И так по кругу.

А если без диодного моста, тогда так:
1: Ожидаем нуля на INT0.
2: Делаем задержку от 1 до 9 мс (вот эту задержку и надо регулировать).
3: Даём импульс на включение тиристора.
4: Ожидаем единицы на INT0.
5: Задержка 1 - 9 мс.
6: Управляющий импульс.
Потом всё с начала.

P.S. Хотя да, можно и один раз за 20 мс ловить импульс, а следующее включение просто делать чере 10 мс. Но я бы ловил 0 и 1 (как во втором варианте).
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 800
Зарегистрирован: Ср апр 25, 2007 09:50:43
Откуда: Киев

Сообщение Аксель »

pyzh_man писал(а):В начальном посте был указан MOC3041... :roll:
..........
синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны.
MOC3041 - встроенный детектор перехода через 0, к-й дает включать нагрузку только при переходе через 0. Нагрузку можно регулировать количеством полуволн...
Скелет колобка состоит из черепа.
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

такой метод регулирования для двигателя не есть айс.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Генеральный секретарь МЯУ
Аватара пользователя
Сообщения: 18887
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.

Сообщение SeregaT »

GP1 писал(а):такой метод регулирования для двигателя не есть айс.
Это да, но работать будет.
Можно ведь и сгладить немного эти импульсы.
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

по поводу ловли 0 через низковольтную часть , если подключить через сопротивление 10 ком к выпрямительному мосту то к какому выводу + или - ??? просто из того что читал нигде не встречал чтобы
так ловили 0, везде напрямую от 220 но без преминение оптопары, насчет MOC3041 еще раз перечитал datashit по оптопарам и действительно у MOC3041, 61 включение после 0, а у MOC3021 нет

в процессе планирую еще выводить на семисигментный двухразрядный индикатор мощность в %, большинство схем которые я смотрел были бестранформаторные и без индикатора .

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

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


посмотрите кусочек кода может быть что опять наколбасил ??????

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

.include "tn2313def.inc"

.equ   Volna   =  0  
.equ   power  =  20  // нач мощность   

            .CSEG     	 		
	.org 0

reset:	rjmp	start		; 00 Reset Handler
	rjmp	INT0		; INT0
	reti			; INT1
	reti			; Timer1 Capture Handler
	reti			; Timer1 Compare Handler
	rjmp     TIM1_OVF	; 05 Timer1 Overflow Handler
	reti     		            ; 06 Timer0 Overflow Handler
	reti		  	; 07 UART RX Complete Handler
	reti			; 08 UDR Empty Handler
	reti			; 09 UART TX Complete Handler
	reti			; 0A Analog ComparatorHandler
            reti
            reti
            reti
            reti
            reti
            reti
            reti
            reti                               ; WDT  

start:	ldi	r16,0xdf		;stack init SP=0xdf
	out	spl,r16

	sbi	ACSR,ACD		;Analog comparator off

	ldi	r16,0xFF		
	out	ddrb,r16		

	ldi	r16,0x00		
	out	portb,r16		

            ldi	r16,0x00		
	out	ddrd,r16		

	ldi	r16,0b11111110		
	out	portd,r16		

	ldi	r16,(1<<ISC00) + (1<<ISC01) + (1<<SE)
            out	MCUCR,r16		;INT0
	
	ldi	r16,0b00000100
	out	TCCR1B,r16		;T/C1 CK/256
	ldi	r16,0b10000000
	out	TIMSK,r16		;T/C1 Overflow INT enable

	ldi	r16,(1<<INT0)
            out	GIMSK,r16		;INT0 enable


INT0:    in   R0,sreg 
            volna = 0
            ldi r16,0xFF
            out TCNT1H, r16
            ldi r16,power
            out TCNT1L, r16
            Timsk    = 0x82 
            sreg,R0 
            reti 


TIM:    in   R0,sreg 
          сbi   R16,0b00000001 
          sbr   R16,0b00000001 
          out   PORTB,R16 

          ldi r16,0xFF
          out TCNT1H, r16
          ldi r16,0x64
          out TCNT1L, r16
          cpse volna , 0 
          Timsk    = 0x02 
          volna = 1
          reti
Вложения
reg.gif
схема мастер кит
(9.14 КБ) 1127 скачиваний
Генеральный секретарь МЯУ
Аватара пользователя
Сообщения: 18887
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.

Сообщение SeregaT »

aleks_bmw528 писал(а):по поводу ловли 0 через низковольтную часть , если подключить через сопротивление 10 ком к выпрямительному мосту то к какому выводу + или - ??? просто из того что читал нигде не встречал чтобы
так ловили 0, везде напрямую от 220
Про диодный мост, это я так, типа мысли в слух (сперва подумал что так лучше). Делай без него. Либо ловить 0 и 1 (конец положительной полуволны и начало следующей положительной) или как писали выше, только ноль, а повторный импульс делать через 10 мс.
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

но я так и не понял как мне выключит симистор в момент начала второй полуволны ????
1. он выключится сам.
2.не нашел основного цикла, в таком виде точно работать не будет
3. по коду буду смотреть, потом чего-нибудь напишу, но

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

          ldi r16,0xFF 
          out TCNT1H, r16 
          ldi r16,0x64 
          out TCNT1L, r16 
так регистры таймеров не грузят. лучше сделать так:

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

          ldi r16,0xFF 
          ldi r17,0x64 
          out TCNT1H, r17 
          out TCNT1L, r16 
и еще, я так понял на асме работаеш недавно, не используй названия регистров, лучше присвой им осмысленные имена, так намного понятней что-куда пишеш/изменяеш.
и я бы разделил задачку между двуми таймерами, 1 формирует задержку включения и вкдючает 2-й таймер, 2 отрабатывает 10 мс.
в общем дай время подумать.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Вот накрапал чуток кода, как мняу вижу проблему.
для сравнения написания оставил исходные строки как коменты.
обрати внимание что в теле программы я не использовал непосредственных значений, удобно если скажем надо выход перекинуть с PORTB на PORTD, меняеш только в одном месте - в описании.
ЗЫ: в AVRStudio работает, точность отработки интервалов около +0.5%, можно поковыряться подобрать коэф'ы, но это оставляю тебе.
Вложения
power.rar
(1.63 КБ) 447 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

Уважаемый GP1 !!! Огромное спасибо за помощь в написании программы .

Изучил написанный тобой код возникает следующая проблема ,могу использовать только таймер T1 ,так как T0 мне нужен для другой цели, попытался доработать код под T1, с использованием алгоритма описанного pyzh_man
ловим переход через 0 - в данном случае INT0; в обработчике прерывания последнего запускаем таймер на время, зависящее от требуемой мощности(больше мощность - меньше время); по истечении времени даем импульс! включения симистора и заряжаем этот же таймер на 10 мс для ловли второй полуволны; по истечении этих 10 мс даем опять же импульс на включение симистора. И далее в цикле повторяем.
возникло несколько вопросов ????

1. Почему ты считаешь лучше использование таймера по совпадению , а не по переполнению???

2. При использовании одного лишь таймера никак не пойму как выключить семистор до начала второй полуволны , в твоем коде он
выключается до начала второй полуволны .

3. Так как давно не писал около 2 лет начал забывать asm
если не трудно не напомнишь как считать 16 - разрядный таймер ???

max

1024*2(16) / 4000000 = 16.777216 c

допустим мне надо 10мс


ldi r16,high(65535 - ???) ;??? - число импульсов
out TCNT1H,r16


256 * 65535 - ( число импульсов ) / 4000000 = мс

Зарание спасибо!!!

Посмотри код пытался переделать под один таймер
Вложения
power1.asm
(4.96 КБ) 590 скачиваний
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Почему режим СТС а не NORMAL?
ты посмотри на свои мучения с расчетами времени :wink:
а я тупо ставлю число тиков таймера (ессно с учетом прескалера) сколько мне надо отсчитать.
etc:
мне надо 10мс
делим 10мс на Fo (или Fo/n) и получается что надо 40 000 тиков, что укладывается в 2^16.
мне так проще.

зы: софтину гляну позже :beer:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»