Страница 1 из 8

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

Добавлено: Вт ноя 17, 2009 12:05:51
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

Добавлено: Вт ноя 17, 2009 13:27:04
GP1
малово-то исходных данных
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности

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

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

ldi r2, 0b00000001
работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.

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

Добавлено: Ср ноя 18, 2009 02:52:29
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мс, или я не так что то понял ???

Добавлено: Ср ноя 18, 2009 06:56:49
headshotbacs
GP1 писал(а):малово-то исходных данных
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности

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

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

ldi r2, 0b00000001
работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
Полностью согласен. Но ничего нет страшного в этом регуляторе. Самое главное ПИШИТЕ и мы ПОМОЖЕМ!!! 8)

Добавлено: Ср ноя 18, 2009 09:29:22
GP1
немного к пояснению работы регулятора
график-1:
если отлавливать только переход из - в + , то семистор отработает положительную полуволну и отключится, и как следствие больше 50% мощности не получить в принципе.
для исключения этого недостатка и производится повторный запуск через 10 мс график-2.

Добавлено: Ср ноя 18, 2009 09:37:51
GP1
добавка.

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

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

когда ты это сделаеш, все встанет на свои места.

Добавлено: Ср ноя 18, 2009 09:44:23
pyzhman
В начальном посте был указан MOC3041... :roll:
По схеме: если уж решено изолировать низковолтьную часть, то надо синхронизироваться от выпрямительного моста, отключив резистор от сетевого провода и подключив его к выпрямительному мосту. И уменьшить его номинал.
По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.

Добавлено: Ср ноя 18, 2009 09:49:11
pyzhman
2GP1 :beer:

Добавлено: Ср ноя 18, 2009 10:06:36
GP1
и еще по схеме:
bt136 не является highcom семистором и поэтому при работе на индуктивную нагрузку, какой и является двигатель, необходимо шунтировать демпфирующей RC цепочкой (номиналы я не помню) для ограничения скорости нарастания тока через семистор.

Добавлено: Ср ноя 18, 2009 10:11:24
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 (как во втором варианте).

Добавлено: Ср ноя 18, 2009 10:45:34
Аксель
pyzh_man писал(а):В начальном посте был указан MOC3041... :roll:
..........
синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны.
MOC3041 - встроенный детектор перехода через 0, к-й дает включать нагрузку только при переходе через 0. Нагрузку можно регулировать количеством полуволн...

Добавлено: Ср ноя 18, 2009 10:48:40
GP1
такой метод регулирования для двигателя не есть айс.

Добавлено: Ср ноя 18, 2009 10:52:42
SeregaT
GP1 писал(а):такой метод регулирования для двигателя не есть айс.
Это да, но работать будет.
Можно ведь и сгладить немного эти импульсы.

Добавлено: Ср ноя 18, 2009 12:40:21
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

Добавлено: Ср ноя 18, 2009 13:12:23
SeregaT
aleks_bmw528 писал(а):по поводу ловли 0 через низковольтную часть , если подключить через сопротивление 10 ком к выпрямительному мосту то к какому выводу + или - ??? просто из того что читал нигде не встречал чтобы
так ловили 0, везде напрямую от 220
Про диодный мост, это я так, типа мысли в слух (сперва подумал что так лучше). Делай без него. Либо ловить 0 и 1 (конец положительной полуволны и начало следующей положительной) или как писали выше, только ноль, а повторный импульс делать через 10 мс.

Добавлено: Ср ноя 18, 2009 13:32:08
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 мс.
в общем дай время подумать.

Добавлено: Ср ноя 18, 2009 17:09:12
GP1
Вот накрапал чуток кода, как мняу вижу проблему.
для сравнения написания оставил исходные строки как коменты.
обрати внимание что в теле программы я не использовал непосредственных значений, удобно если скажем надо выход перекинуть с PORTB на PORTD, меняеш только в одном месте - в описании.
ЗЫ: в AVRStudio работает, точность отработки интервалов около +0.5%, можно поковыряться подобрать коэф'ы, но это оставляю тебе.

Добавлено: Чт ноя 19, 2009 14:20:22
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 = мс

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

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

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

зы: софтину гляну позже :beer: