Страница 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: