Прошивка attiny2313 + тиристор bt136
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
Прошивка attiny2313 + тиристор bt136
Всем привет. Делаю регулятор мощности для кухонной вытяжки на 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
Помогите с написанием прошивки!!!
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
- Откуда: Россия, Волгоград
- Контактная информация:
малово-то исходных данных
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности
зы:
конструкция
работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности
зы:
конструкция
Код: Выделить всё
ldi r2, 0b00000001работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
to aleks_bmw528:
если верно понял, то предполагается применить фазовую регулировку мощности. Для этого не нужно применять МОС. Он включает только при переходе через 0. А Вам нужна фазовая регулировка, т.е. включение тиристора через определенное время после перехода через 0, в зависимости от требуемой мощности. Делаем так: ловим переход через 0 - в данном случае INT0; в обработчике прерывания последнего запускаем таймер на время, зависящее от требуемой мощности(больше мощность - меньше время); по истечении времени даем импульс! включения симистора и заряжаем этот же таймер на 10 мс для ловли второй полуволны; по истечении этих 10 мс даем опять же импульс на включение симистора. И далее в цикле повторяем.
зы: фазовая регулировка скорости вращения двигателя в вытяжке - весьма сомнительное занятие...
если верно понял, то предполагается применить фазовую регулировку мощности. Для этого не нужно применять МОС. Он включает только при переходе через 0. А Вам нужна фазовая регулировка, т.е. включение тиристора через определенное время после перехода через 0, в зависимости от требуемой мощности. Делаем так: ловим переход через 0 - в данном случае INT0; в обработчике прерывания последнего запускаем таймер на время, зависящее от требуемой мощности(больше мощность - меньше время); по истечении времени даем импульс! включения симистора и заряжаем этот же таймер на 10 мс для ловли второй полуволны; по истечении этих 10 мс даем опять же импульс на включение симистора. И далее в цикле повторяем.
зы: фазовая регулировка скорости вращения двигателя в вытяжке - весьма сомнительное занятие...
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
схему нарисовал
извиняюсь за код ldi r2, 0b00000001 это я на скоряк писал
частота 4МГц !
MOC3021 решил применить чтобы не использовать
выходные порты проца ,ток открытия симистора около 100ма и
придется использовать четыре порта что не хотелась бы , а во вторых развязка отдельно помоему лучше , но я не уверен что если использовать MOC3021 через транс ,а ловить 0 через сопротивление
1МоМ напрямую к 220 ,будет работать корректно ????
MOC3021 не реагирует на 0 MOC3041 реагирует!!!
вопрос!!! к pyzh_man почему надо заряжать таймер на 10мс если он уже отработал как бы 3мс ведь полупериуд = 10мс, или я не так что то понял ???
извиняюсь за код 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
- Откуда: Краматорск
GP1 писал(а):малово-то исходных данных
нужно:
1. тактовая проца
2. расключение (можно схему)
3. почитайте про регуляторы мощности
зы:
конструкцияКод: Выделить всё
ldi r2, 0b00000001
работать не будет, ldi применима только к старшим регистрам от R16 до R31, компилятор выдаст ошибку.
не помешало бы и про систему команд почитать, чтобы меньше вопросов возникало и говорить с людьми на одном языке.
Полностью согласен. Но ничего нет страшного в этом регуляторе. Самое главное ПИШИТЕ и мы ПОМОЖЕМ!!!
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
немного к пояснению работы регулятора
график-1:
если отлавливать только переход из - в + , то семистор отработает положительную полуволну и отключится, и как следствие больше 50% мощности не получить в принципе.
для исключения этого недостатка и производится повторный запуск через 10 мс график-2.
график-1:
если отлавливать только переход из - в + , то семистор отработает положительную полуволну и отключится, и как следствие больше 50% мощности не получить в принципе.
для исключения этого недостатка и производится повторный запуск через 10 мс график-2.
- Вложения
-
- -1.JPG
- (62.81 КБ) 1200 скачиваний
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
добавка.
Прежде чем писать программу, набросай алгоритм, хочеш - графический, хочеш - словесный.
Это необходимо прежде всего для тебя самого чтобы понять, что нужно делать и в какие моменты времени, например так:
1. определить момент перехода через 0
2. отработать задержку ХХ мс
3. выдать упр. напряжение на МОС
и т.д.
когда ты это сделаеш, все встанет на свои места.
Прежде чем писать программу, набросай алгоритм, хочеш - графический, хочеш - словесный.
Это необходимо прежде всего для тебя самого чтобы понять, что нужно делать и в какие моменты времени, например так:
1. определить момент перехода через 0
2. отработать задержку ХХ мс
3. выдать упр. напряжение на МОС
и т.д.
когда ты это сделаеш, все встанет на свои места.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
В начальном посте был указан MOC3041...
По схеме: если уж решено изолировать низковолтьную часть, то надо синхронизироваться от выпрямительного моста, отключив резистор от сетевого провода и подключив его к выпрямительному мосту. И уменьшить его номинал.
По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.
По схеме: если уж решено изолировать низковолтьную часть, то надо синхронизироваться от выпрямительного моста, отключив резистор от сетевого провода и подключив его к выпрямительному мосту. И уменьшить его номинал.
По регулировке: синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны. А вот чтобы включить в работу и вторую полуволну нам надо включить симистор через 10 мс после первого включения.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
и еще по схеме:
bt136 не является highcom семистором и поэтому при работе на индуктивную нагрузку, какой и является двигатель, необходимо шунтировать демпфирующей RC цепочкой (номиналы я не помню) для ограничения скорости нарастания тока через семистор.
bt136 не является highcom семистором и поэтому при работе на индуктивную нагрузку, какой и является двигатель, необходимо шунтировать демпфирующей RC цепочкой (номиналы я не помню) для ограничения скорости нарастания тока через семистор.
Последний раз редактировалось GP1 Ср ноя 18, 2009 10:17:11, всего редактировалось 1 раз.
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18849
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
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
- Откуда: Киев
- Контактная информация:
MOC3041 - встроенный детектор перехода через 0, к-й дает включать нагрузку только при переходе через 0. Нагрузку можно регулировать количеством полуволн...pyzh_man писал(а):В начальном посте был указан MOC3041...![]()
..........
синхроимнульс мы ловим только один раз за период(20 мс). По нему мы отрегулируем время включения первой полуволны.
Скелет колобка состоит из черепа.
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
по поводу ловли 0 через низковольтную часть , если подключить через сопротивление 10 ком к выпрямительному мосту то к какому выводу + или - ??? просто из того что читал нигде не встречал чтобы
так ловили 0, везде напрямую от 220 но без преминение оптопары, насчет MOC3041 еще раз перечитал datashit по оптопарам и действительно у MOC3041, 61 включение после 0, а у MOC3021 нет
в процессе планирую еще выводить на семисигментный двухразрядный индикатор мощность в %, большинство схем которые я смотрел были бестранформаторные и без индикатора .
регулятор решил сделать потому что вытяжка на кухне задолбала очень сильно всасывать даже на малой скорости , поэтому для начала собрал простенький регулятор мощности по схеме мастер кит,
регулирует отлично хорошо запускается даже с супер низких оборотов, но мне кажется что при включении с использованием контроллера надо будет при включении запускать со средних оборотов ,а потом уменьшить до исходных это будет лучше для мотора. Устройство собираю на макетной плате ,поэтому в любой момент могу изменять схему
насчет 10мс , это я вчера тупанул никаких 10мс -3мс ,в таймере T1 дозаряд ровно на 10мс нужен для включения во второй полуволне
семистора , 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
- Откуда: Россия. Омск.
- Контактная информация:
aleks_bmw528 писал(а):по поводу ловли 0 через низковольтную часть , если подключить через сопротивление 10 ком к выпрямительному мосту то к какому выводу + или - ??? просто из того что читал нигде не встречал чтобы
так ловили 0, везде напрямую от 220
Про диодный мост, это я так, типа мысли в слух (сперва подумал что так лучше). Делай без него. Либо ловить 0 и 1 (конец положительной полуволны и начало следующей положительной) или как писали выше, только ноль, а повторный импульс делать через 10 мс.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
но я так и не понял как мне выключит симистор в момент начала второй полуволны ????
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
- Откуда: Россия, Волгоград
- Контактная информация:
Вот накрапал чуток кода, как мняу вижу проблему.
для сравнения написания оставил исходные строки как коменты.
обрати внимание что в теле программы я не использовал непосредственных значений, удобно если скажем надо выход перекинуть с PORTB на PORTD, меняеш только в одном месте - в описании.
ЗЫ: в AVRStudio работает, точность отработки интервалов около +0.5%, можно поковыряться подобрать коэф'ы, но это оставляю тебе.
для сравнения написания оставил исходные строки как коменты.
обрати внимание что в теле программы я не использовал непосредственных значений, удобно если скажем надо выход перекинуть с PORTB на PORTD, меняеш только в одном месте - в описании.
ЗЫ: в AVRStudio работает, точность отработки интервалов около +0.5%, можно поковыряться подобрать коэф'ы, но это оставляю тебе.
- Вложения
-
- power.rar
- (1.63 КБ) 444 скачивания
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
Уважаемый GP1 !!! Огромное спасибо за помощь в написании программы .
Изучил написанный тобой код возникает следующая проблема ,могу использовать только таймер T1 ,так как T0 мне нужен для другой цели, попытался доработать код под T1, с использованием алгоритма описанного pyzh_man
возникло несколько вопросов ????
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 = мс
Зарание спасибо!!!
Посмотри код пытался переделать под один таймер
Изучил написанный тобой код возникает следующая проблема ,могу использовать только таймер 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
- Откуда: Россия, Волгоград
- Контактная информация:
Почему режим СТС а не NORMAL?
ты посмотри на свои мучения с расчетами времени
а я тупо ставлю число тиков таймера (ессно с учетом прескалера) сколько мне надо отсчитать.
etc:
мне надо 10мс
делим 10мс на Fo (или Fo/n) и получается что надо 40 000 тиков, что укладывается в 2^16.
мне так проще.
зы: софтину гляну позже
ты посмотри на свои мучения с расчетами времени
а я тупо ставлю число тиков таймера (ессно с учетом прескалера) сколько мне надо отсчитать.
etc:
мне надо 10мс
делим 10мс на Fo (или Fo/n) и получается что надо 40 000 тиков, что укладывается в 2^16.
мне так проще.
зы: софтину гляну позже

