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

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

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

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

Сообщение pyzhman »

to aleks_bmw528:
если верно понял, то предполагается применить фазовую регулировку мощности. Для этого не нужно применять МОС. Он включает только при переходе через 0. А Вам нужна фазовая регулировка, т.е. включение тиристора через определенное время после перехода через 0, в зависимости от требуемой мощности. Делаем так: ловим переход через 0 - в данном случае INT0; в обработчике прерывания последнего запускаем таймер на время, зависящее от требуемой мощности(больше мощность - меньше время); по истечении времени даем импульс! включения симистора и заряжаем этот же таймер на 10 мс для ловли второй полуволны; по истечении этих 10 мс даем опять же импульс на включение симистора. И далее в цикле повторяем.
зы: фазовая регулировка скорости вращения двигателя в вытяжке - весьма сомнительное занятие...
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 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 КБ) 1324 скачивания
Аватара пользователя
headshotbacs
Вымогатель припоя
Сообщения: 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 КБ) 1200 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

добавка.

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

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

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

Сообщение pyzhman »

В начальном посте был указан MOC3041... :roll:
По схеме: если уж решено изолировать низковолтьную часть, то надо синхронизироваться от выпрямительного моста, отключив резистор от сетевого провода и подключив его к выпрямительному мосту. И уменьшить его номинал.
По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 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 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18849
Зарегистрирован: Пн сен 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 »

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

Сообщение SeregaT »

GP1 писал(а):такой метод регулирования для двигателя не есть айс.

Это да, но работать будет.
Можно ведь и сгладить немного эти импульсы.
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 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 КБ) 1125 скачиваний
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18849
Зарегистрирован: Пн сен 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 КБ) 444 скачивания
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 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 КБ) 588 скачиваний
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

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

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

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