|
Версия 2.
с ЖК
дисплеем
Чтобы зайти в настройки - нужно удерживая кнопку
SETTING нажать RESET. Там есть пять
параметров - ustavka_min, ustavka_max, thc_on_min, thc_on_max, thc_time. Если
измеряемое напряжение между значениями thc_on_min и thc_on_max, то
подаётся сигнал THC ON на 10pin
LPT, если напряжение на входе ниже (нет тока плазмы) либо выше
(плазма не зажглась или погасла) то сигнал THC ON
не подаётся. ustavka_min, ustavka_max - это
значение для крайних положений регулировки ТНС на панели управления.
Если напряжение выше уставки - то подаётся сигнал THC
DOWN (12pin), если измеряемое напряжение ниже уставки - то
подаётся сигнал THC UP(11pin).
При сработке датчика касания сигнал идёт на 13pin LPT.
рисовал на скорую руку т.ч. проверяйте, в исходниках
(внизу) есть подключение периферии к портам контроллера.
P.s. может кто красиво нарисует - скажу
спасибо )) thc3.spl7
Версия 1.
Для изготовления системы ТНС я выбрал микроконтроллер
Atmega8. Потому что у неё питание и логический
уровень +5В, в отличие от STM +3,3В.
Принцип работы прост - напряжение плазмы через резисторы поступает на
накопительный конденсатор 0,01мк и разряжается динистором на
трансформатор, далее через оптрон сигнал приходит на контроллер
ATmega8 (получается двойная гальваническая
развязка). Он считает количество импульсов, чем выше напряжение плазмы,
тем быстрее заряжается конденсатор, значит выше частота разрядов.
(примерно 140 импульсов за 0,1сек при 140В)
Если напряжение выше 40В, контроллер подаёт сигнал
THC ON.
Уставку значения ТНС считываем через АЦП (с переменного
резистора) и если измеренное напряжение меньше (уставка - 2В) то подаётся
сигнал THC UP, если больше (уставка + 2 вольта),
то подаю сигнал THC DOWN. ВСЁ!!!
Компилятор мне понравился mikroBasic PRO for AVR. Простой, все
библиотеки одинаковые (не нужно где-то качать из разных источников и
устанавливать) и включены сразу в программу, много примеров и большой
хелпфорум. Схема ТНС на микроконтроллере
ATmega8. (обновлена 09.09.18г)
DA - pc817(или аналог),
VD1- динистор DB3,
C7-0.01мк 250в плёночный к73-17
резисторы R8-R13 100кОм 1Вт, трансформатор Т1
- ферритовый транс. 10-20мГн, он же фильтр синфазных помех из БП компа
при работе плазмы шлейф А1 и А2 замкнуты и заземлены на массу стола,
при поиске металла, когда горелка упирается в поверхность, цепь А1 и А2
размыкается.
Блок включения плазмы
На некоторых ЧПУ слабое звено - блок включения плазмы, т.к. бывают
ТАКИЕ помехи, что с этого провода стреляет более чем на 10мм.
Здесь реализована трёх ступенчатая защита - оптрон, трансформатор и
реле. Отптосиммистор MOC3083 подаёт 220В на
трансформатор 220/6 (либо 220/12 если у вас реле на 12в), 6в через
выпрямитель поступает на реле (на 5В), которое включает плазму.
Прошивка тута.
Программа: program THC dim thc as word
dim adc_rd as word
dim ustavka as longword main:
CS10_bit = 1 CS11_bit = 1 CS12_bit = 1 'внешний
вход счётчика TCNT1
DDRB = %11000000 'b6-THC ON b7-THC UP
DDRC = %00000000
DDRD = %01000000 'd6-THC DOWN
PORTB = %00111111
PORTC = 255
PORTD = %10111111
ADC_Init() While true
TCNT1H = 0 'обнуляю старшие разряды счётчика
TCNT1L = 0 'обнуляю младшие разряды счётчика
delay_ms(100) 'пауза 0,1сек
Lo(thc) = TCNT1L 'читаю младший байт счётчика
Hi(thc) = TCNT1H 'читаю старший байт счётчика
adc_rd = ADC_Read(1) 'читаю значение АЦП (положение
регулировки высоты горелки)
ustavka = 90 + (70 * adc_rd / 1024) 'значение
уставки ТНС от положения крутилки
if thc > 20 then PORTB.6=1 'если напряжение плазмы
больше 40в
if thc < (ustavka - 2) then PORTB.7=1 else PORTB.7=0 end if
'если напряжение меньше (допуск 2В), то включаем THC UP
if thc > (ustavka + 2) then PORTD.6=1 else PORTD.6=0 end if
'если напряжение больше (допуск 2В), то включанем
ТНС DOWN
else
PORTB.6=0 ' THC ON
PORTB.7=0 ' THC UP
PORTD.6=0 ' THC DOWN
end if
wend
end. Исходники тута
Программа для версии
2 с ЖК дисплеем:
готовый hex файл
program THC
'D4 кнопка -
'D3 кнопка +
'D2 кнопка Настр
'D1 - lcd D7
'D0 - lcd D6
'C5 - lcd D5
'C4 - lcd D4
'C3 - lcd E
'C2 - lcd RS
'C1 - ADC1
'D5 - imp THC
'D6 - in probe
'D7 - out 13 (probe)
'B0 - out 10 (tnc on)
'B6 - out 12 (thc down)
'B7 - out 11 (thc up)
dim probe_out as sbit at PORTD.7
dim thc_on as sbit at PORTB.0
dim thc_up as sbit at PORTB.7
dim thc_down as sbit at PORTB.6
dim probe_in as sbit at PIND.6
dim knopka_minus as sbit at PIND.4
dim knopka_plus as sbit at PIND.3
dim knopka_setting as sbit at PIND.2
dim LCD_RS as sbit at PORTC2_bit
dim LCD_EN as sbit at PORTC3_bit
dim LCD_D4 as sbit at PORTC4_bit
dim LCD_D5 as sbit at PORTC5_bit
dim LCD_D6 as sbit at PORTD0_bit
dim LCD_D7 as sbit at PORTD1_bit
dim LCD_RS_Direction as sbit at DDC2_bit
dim LCD_EN_Direction as sbit at DDC3_bit
dim LCD_D4_Direction as sbit at DDC4_bit
dim LCD_D5_Direction as sbit at DDC5_bit
dim LCD_D6_Direction as sbit at DDD0_bit
dim LCD_D7_Direction as sbit at DDD1_bit
dim thc as word
dim adc_rd, adc_temp, ustavka_max, ustavka_min, thc_on_min, thc_on_max,
ustavka_word as word
dim ustavka as longword
dim txt5 as string[5]
dim txt3 as string[3]
dim thc_time, i, lcd_clear as byte
main:
CS10_bit = 1 CS11_bit = 1 CS12_bit = 1 'внешний
вход счётчика TCNT1
DDRB = %11000001
PORTB = %00111110
DDRC = %00111100
PORTC = %11000011
DDRD = %10000011
PORTD = %01111100
ADC_Init()
Lcd_Init()
Lcd_Cmd(_LCD_CLEAR)
Lcd_Cmd(_LCD_CURSOR_OFF)
LCD_Out(1,1,"Armatura-ural.ru")
delay_ms(300)
hi(ustavka_min) = EEPROM_Read(00)
lo(ustavka_min) = EEPROM_Read(01)
hi(ustavka_max) = EEPROM_Read(02)
lo(ustavka_max) = EEPROM_Read(03)
hi(thc_on_min) = EEPROM_Read(04)
lo(thc_on_min) = EEPROM_Read(05)
hi(thc_on_max) = EEPROM_Read(06)
lo(thc_on_max) = EEPROM_Read(07)
thc_time = EEPROM_Read(08)
if ustavka_max = ustavka_min then ustavka_max = 200 ustavka_min = 80
thc_on_min = 70 thc_on_max=220 thc_time=100 end if
if knopka_setting = 0 then
Lcd_Cmd(_LCD_CLEAR)
LCD_Out(1,1,"ustavka_min")
while knopka_setting = 0 wend
while knopka_setting = 1
if knopka_plus =0 then ustavka_min = ustavka_min + 1 while knopka_plus=0
wend end if
if knopka_minus=0 then ustavka_min = ustavka_min - 1 while knopka_minus=0
wend end if
WordToStr(ustavka_min, txt5)
LCD_Out(2,1,txt5)
wend
while knopka_setting = 0 wend
Lcd_Cmd(_LCD_CLEAR)
LCD_Out(1,1,"ustavka_max")
while knopka_setting = 1
if knopka_plus =0 then ustavka_max = ustavka_max + 1 while knopka_plus=0
wend end if
if knopka_minus=0 then ustavka_max = ustavka_max - 1 while knopka_minus=0
wend end if
WordToStr(ustavka_max, txt5)
LCD_Out(2,1,txt5)
wend
while knopka_setting = 0 wend
Lcd_Cmd(_LCD_CLEAR)
LCD_Out(1,1,"thc_on_min")
while knopka_setting = 1
if knopka_plus =0 then thc_on_min = thc_on_min + 1 while knopka_plus=0
wend end if
if knopka_minus=0 then thc_on_min = thc_on_min - 1 while knopka_minus=0
wend end if
WordToStr(thc_on_min, txt5)
LCD_Out(2,1,txt5)
wend
while knopka_setting = 0 wend
Lcd_Cmd(_LCD_CLEAR)
LCD_Out(1,1,"thc_on_max")
while knopka_setting = 1
if knopka_plus =0 then thc_on_max = thc_on_max + 1 while knopka_plus=0
wend end if
if knopka_minus=0 then thc_on_max = thc_on_max - 1 while knopka_minus=0
wend end if
WordToStr(thc_on_max, txt5)
LCD_Out(2,1,txt5)
wend
while knopka_setting = 0 wend
Lcd_Cmd(_LCD_CLEAR)
LCD_Out(1,1,"thc_time")
while knopka_setting = 1
if knopka_plus =0 then thc_time = thc_time + 1 while knopka_plus=0 wend
end if
if knopka_minus=0 then thc_time = thc_time - 1 while knopka_minus=0 wend
end if
ByteToStr(thc_time, txt3)
LCD_Out(2,1,txt3)
wend
EEPROM_Write(00, hi(ustavka_min))
EEPROM_Write(01, lo(ustavka_min))
EEPROM_Write(02, hi(ustavka_max))
EEPROM_Write(03, lo(ustavka_max))
EEPROM_Write(04, hi(thc_on_min))
EEPROM_Write(05, lo(thc_on_min))
EEPROM_Write(06, hi(thc_on_max))
EEPROM_Write(07, lo(thc_on_max))
EEPROM_Write(08, thc_time)
end if
Lcd_Cmd(_LCD_CLEAR)
While true
TCNT1H = 0 'обнуляю старшие разряды счётчика
TCNT1L = 0 'обнуляю младшие разряды счётчика
for i = 0 to thc_time
delay_ms(1)
if probe_in = 0 then probe_out = 1 else probe_out = 0 end if
next i
Lo(thc) = TCNT1L 'читаю младший байт счётчика
Hi(thc) = TCNT1H 'читаю старший байт счётчика
adc_temp = ADC_Read(1)
if ((adc_rd > (adc_temp + 2)) or (adc_rd < (adc_temp - 2))) then adc_rd
= adc_temp end if
ustavka = ustavka_min + ((ustavka_max - ustavka_min) * adc_rd / 1024)
ustavka_word = ustavka
WordToStr(ustavka_word, txt5)
if knopka_setting = 0 then Lcd_Init() Lcd_Cmd(_LCD_CURSOR_OFF) Lcd_Cmd(_LCD_CLEAR)
end if
lcd_clear = lcd_clear + 1
if lcd_clear > 20 then lcd_clear = 0 Lcd_Cmd(_LCD_CLEAR) end if
LCD_Out(2,12,txt5)
WordToStr(thc, txt5)
LCD_Out(1,12,txt5)
if probe_in = 0
then probe_out = 1 LCD_Out(1,5,"-Touch-")
else probe_out = 0 LCD_Out(1,5," ")
end if
if ((thc < thc_on_max) and (thc > thc_on_min)) then
LCD_Out(1,1,"ON ")
thc_on = 1
if thc = ustavka_word then
thc_down=0
thc_up=0
LCD_Out(2,1,"OK ")
end if
if thc > ustavka_word then
thc_down=1
thc_up=0
LCD_Out(2,1,"DOWN")
end if
if thc < ustavka_word then
thc_down=0
thc_up=1
LCD_Out(2,1,"UP ")
end if
else
LCD_Out(1,1,"OFF")
thc_on = 0
thc_down=0
thc_up=0
LCD_Out(2,1," ")
end if
wend
end. |
|