Страница 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 применима только к старшим регистрам от 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 применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
Полностью согласен. Но ничего нет страшного в этом регуляторе. Самое главное ПИШИТЕ и мы ПОМОЖЕМ!!!

Добавлено: Ср ноя 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...
По схеме: если уж решено изолировать низковолтьную часть, то надо синхронизироваться от выпрямительного моста, отключив резистор от сетевого провода и подключив его к выпрямительному мосту. И уменьшить его номинал.
По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.
Добавлено: Ср ноя 18, 2009 09:49:11
pyzhman
2GP1

Добавлено: Ср ноя 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...
..........
синхроимнульс мы ловим только один раз за период(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?
ты посмотри на свои мучения с расчетами времени
а я тупо ставлю число тиков таймера (ессно с учетом прескалера) сколько мне надо отсчитать.
etc:
мне надо 10мс
делим 10мс на Fo (или Fo/n) и получается что надо 40 000 тиков, что укладывается в 2^16.
мне так проще.
зы: софтину гляну позже
