Power Electronics http://valvol.ru/ |
|
Концепция MMA-MAG-MIG-TIG источника с управлением на PIC http://valvol.ru/topic406.html |
Страница 11 из 13 |
Автор: | sam_soft [ 25-08, 16:18 ] |
Заголовок сообщения: | |
Melvin77 писал(а): Не совсем понятна суть вопроса. Но если об стабильности поджига дуги то на мой взгляд источник должен работать в режиме стабиллизатора тока и на переменке еще есть и осцилятор там не все от источника зависит. Хотя конечно процику может быть тоскливо дуга есть нагрузка динамическая.
Ну не все так просто. Почитай на сайте у Миллера . Там есть отличны хэнд бук для молодого ТИГера , то что касается адвансед сквэ вэйв. То что тама написано, фактически ихния идеи, я и воплотил в работаюшую канстукцыю. |
Автор: | monos [ 25-08, 18:57 ] |
Заголовок сообщения: | |
Я тута затеял к сварке прикрутить семисегментный лед на 4 разряда... Сначала думал малость подправить программульку- ввести прерывания от таймера для динамики ледов, а потом подумал и решил всю программу переписать: в прерывании от аппаратного таймера (~920uS) инкриминируется программный счетчик (до 12 и потом сначала), считая прерывания и в switch выбирается соответствующий case, а в этих кэйсах расписаны динамика ледов и все программа... На первый взгляд должно работать... А может это чепуха? |
Автор: | MasterCat [ 25-08, 19:01 ] |
Заголовок сообщения: | |
sam_soft писал(а): Почитай на сайте у Миллера это ещё где..? monos писал(а): а в этих кэйсах расписаны динамика ледов и все программа
во замутил. а для тупых с примерчиком. шоб понятно было.. |
Автор: | MasterCat [ 25-08, 20:22 ] |
Заголовок сообщения: | |
Melvin77 писал(а): А по правде сказать зачем несколько контролеров?
ну это-то шито белыми нитками. один силой рулит, один картинки кажет, один за питанием приглядывает. если модуль какой добавили - то самодостаточный тоже. примитивные конечные автоматы вообщем. полигамия , одним словом. |
Автор: | Melvin77 [ 25-08, 20:49 ] |
Заголовок сообщения: | |
не знаю но помоему чет сильно заумно, один бы справился. |
Автор: | MasterCat [ 25-08, 20:55 ] |
Заголовок сообщения: | |
Melvin77 писал(а): сильно заумно, один бы справился
справился бы.. кто спорит. только в одном флаконе всё всегда не очень. особенно если девайс развивается. скажем меняем служебного с выпрямителем и защитой по входу.. ну меняем весь интеллигентный узел. остальное-то не трогаем. и так с каждым узлом. если на автомобиль ставлю аккумулчтор меньшего, скажем, размера, мне ж не приходится менять половину авто. |
Автор: | Melvin77 [ 25-08, 22:16 ] |
Заголовок сообщения: | |
Ну так сделайте блок питания служебный со всеми напряжениями что необходимы и если вы его захотите сменить то напряжение питания контролера от этого не изменится как и остальные напряжения питания. И незачем менять все на свете, я себе именно так и предполагаю сделать. Только зачем контролер в блоке питания да еще и увязаный в нечто вроде сети непонятно. Может это Вы нечто вроде хайтэка какого решили организовать тогда понятно. А ЖКИ индикаторы в своем составе как правило уже имеют контролер и очень часто именно по I2C подключаются и даже для ЖКИ есть так ненавистные стандартные библиотеки хоть в CVAVR хоть в AVRStudio хоть для сишников хоть для асемблерников. Не вижу ни одной разумной причины городить огород. |
Автор: | MasterCat [ 25-08, 22:21 ] |
Заголовок сообщения: | |
Melvin77 писал(а): Не вижу ни одной разумной причины городить огород.
ну МК это всего лиш мелкосхема. такая же как тригер или счетчик. чего его экономить не понятно. или сэкономленные байты на сдачу дадут? лет 10 назад я тоже пытался впихнуть всё в один. времена меняются и мы вместе с ними. |
Автор: | MasterCat [ 25-08, 22:23 ] |
Заголовок сообщения: | |
Melvin77 писал(а): сделайте блок питания служебный со всеми напряжениями что необходимы и если вы его захотите сменить то напряжение питания контролера от этого не изменится как
подождем, когда 2110 стрельнет с примененного блока питания и обсудим блок питания. |
Автор: | monos [ 25-08, 22:30 ] |
Заголовок сообщения: | |
MasterCat писал(а): с примерчиком. шоб понятно было.
Чтоб было понятно. Только в майне будет пустой цикл, а все задачи рассредоточены по кейсам... Код: #include <pic.h>
#include "delay.h" #include "main.h" #define r1 un.bt.d1 #define r2 un.bt.d2 #define r3 un.bt.d3 #define r4 un.bt.d4 #define HOT un.bt.e1 #define ARK un.bt.e2 #define RELE un.bt.e3 #define FAN un.bt.e4 #define DIG un.led_port #define PWM_ARC CCPR1L // Регистр длит. импульса ШИМа преобразователя. #define PWM_REF CCPR2L // Регистр длит. имп. ШИМа опорного напряжения (задания) #define I_U RC0 // тумблер индикации "Напряжение/Ток" #define Lat_LED RC4 // защелка регистров 74HC595 //---------------------------- #define vref_p 4860 // в миливольтах #define vref_m 0 #define lsb (vref_p - vref_m)/1024.0 #define k 10 //---------------------------- #define Zmin 10 // Мин.скважность шим ЦАП опоры (0,1). #define Zmax 85 // Макс.скважность шим ЦАП опоры (0,85). #define Zfors 100 // Макс. скважность шим ЦАП опоры (1 для форсажа дуги). #define k_ref (Zmax-Zmin)/254 // Коэфф. для масштабирования результата АЦП задания тока (для опоры). //---------------------------- #define ind_Imin 50 // Мин. сварочный ток, А. #define ind_Imax 155 // Макс. сварочный ток, А. #define k_ind (ind_Imax-ind_Imin)/254 // Коэфф. для масштабирования результата АЦП задания тока (для индикации). //----------------------------------------------------------- __CONFIG(HS & WDTDIS & PWRTDIS & MCLRDIS & BOREN & LVPDIS & UNPROTECT & DUNPROTECT & IESODIS & FCMDIS & BORV40); //----------------------------------------------------------- // объявляем используемые функции void inttostr(unsigned int tmp); void init_(void); unsigned int adc_Uout(void); unsigned int adc_setIarc(void); unsigned int adc_setIfors(void); unsigned int adc_setIhot_start(void); unsigned int adc_setUarc(void); unsigned int adc_Tkey(void); void port_leds(void); //----------------------------------------------------------- // объявляем глобальные переменные unsigned char arr[4]; unsigned char PORT; const unsigned char arr1[16]={63,6,91,79,102, 109,125,7,127,111,119,62,62,62,62,62 };// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, c, U, E, F==общий АНОД volatile unsigned char count_r; unsigned int count,count1; double rez; unsigned char setIarc; //регистр установок задания свар. тока unsigned char setIfors; //регистр установок задания тока форсажа дуги unsigned char setIhot_start; //регистр установок задания тока хот старта unsigned int setUarc; //регистр установок задания напряжения дуги unsigned char Tkey; //регистр температуры ключей unsigned char set_ref; unsigned char set_ind; unsigned int Uout; //------------------- union{ struct { unsigned d1 : 1; unsigned d2 : 1; unsigned d3 : 1; unsigned d4 : 1; unsigned e1 : 1; unsigned e2 : 1; unsigned e3 : 1; unsigned e4 : 1; }bt; unsigned char led_port; }un; //----------------- typedef union { struct { unsigned char lo; unsigned char hi; }st; unsigned int all; }tun; tun t; //------------------------------------------------------------- interrupt void _tmr0(void)// начало обработки прерывания { unsigned char temp,cnt; if (T0IF & T0IE) // если срабатывание прерывания вызвано таймером { TMR0=240; //~920uS T0IF=0; switch (count_r) { case 0: break; case 1: break; case 2: // для 1 разряда Lat_LED=0; // сбросили клок защелки r4=1; // включили 1 разряд r1=0; // выключили 4 разряд cnt=0; temp=arr[cnt]; //temp=arr[count_r]; // получили значение по 0 адресу PORT=arr1[temp]; //получили образ числа port_leds(); // и выдали на индикаторы Lat_LED=1; // защелкнули регистры 595 break; // ушли case 3: break; case 4: break; case 5: Lat_LED=0; r1=1; r2=0; cnt=1; temp=arr[cnt]; //temp=arr[count_r]; PORT=arr1[temp]; port_leds(); Lat_LED=1; break; case 6: break; case 7: break; case 8: Lat_LED=0; r2=1; r3=0; cnt=2; temp=arr[cnt]; //temp=arr[count_r]; PORT=arr1[temp]; port_leds(); Lat_LED=1; break; case 9: break; case 10: break; case 11: Lat_LED=0; r3=1; r4=0; cnt=3; temp=arr[cnt]; //temp=arr[count_r]; PORT=119; port_leds(); Lat_LED=1; break; } count_r++; // добавили счетчик разрядов if (count_r == 12) count_r=0; // если крайнее значение, обнуляем счетчик } // выход обработки таймера }// выход прерывания //----------------------------------------------------------- void main(){ init_(); while(1){ adc_setIarc(); set_ref = ((setIarc * k_ref)+Zmin); // масшабируем результат оцифровки потенциометра задания тока PWM_REF = set_ref; // и устанавливаем соответственнный К.зап. ШИМа ЦАПа задания тока set_ind = ((setIarc * k_ind)+ind_Imin);//масшабируем результат оцифровки потенциометра задания тока // индицируем задание тока inttostr(set_ind); }// окончание бесконечного цикла } //-------------------------------------------------------------- void init_(void){ PORTA = 0; PORTB = 0; PORTC = 0; count = 0; PR2 = 100; // Длительность периода раб. частоты инвертора--20мксек @ 20Мгц ==50кГц. PWM_ARC=0; //регистр длит. импульса ШИМ ключей обнулен PWM_REF=0; //регистр длит. импульса ШИМ опоры компаратора обнулен //---------------------------- CCP2CON=0B00001100; // Модуль ССР2 настроен, как однотактный ШИМ CCP1CON=0B00001100; // Модуль ССР1 настроен, как однотактный ШИМ //---------------------------- // настройка PWM1CON PRSEN = 1; // Авторестарт модуля ШИМ после пропадания сигнала сброса //---------------------------- // настройка ECCPAS ECCPASE = 1; // Аппаратный сброс главного шима ECCPAS0 = 0; // аппаратный сброс шима ECCPAS1 = 1; // по высокому уровню ECCPAS2 = 1; // любого из компараторов (С1 или С2) PSSAC0 = 0; // В состоянии сброса выходы Р1А и Р1С PSSAC1 = 0; // устанавливаются в "0" PSSBD0 = 0; // В состоянии сброса выходы Р1B и Р1D PSSBD1 = 0; // устанавливаются в "0" //---------------------------- // настройка PSTRCON STRA = 1; //Выход Р1А становлен, как выход ШИМ //---------------------------- TRISA = 0; TRISA6 = 1; TRISA7 = 1; TRISA0 = 1; TRISB = 0; TRISC = 0; ANSEL = 0; ANSELH = 0; ANS0=1; //---------------------------- // настройка ADСON1 VCFG0 = 0; //Vss VCFG1 = 0; //Vdd //---------------------------- // настройка ADСON0 // частота на 32 ADCS1 = 1; ADCS0 = 0; GODONE = 0; ADON = 1; // включаем модуль АЦП //---------------------------- TMR2ON = 1; // Таймер TMR2 включен TMR1ON = 1; // Таймер TMR1 включен // -------------------------- //таймер TMR0 установки TMR0 = 240; PSA = 0; T0CS = 0; T0SE = 0;// bit 4 TMR0 Source Edge Select bit: 0=low/high //--------------------------- //SPI установки CKE = 1; //слок в середине бита данных CKP = 1; // SSPSTAT = 0; SSPM3 = 0; // делитель на 64 SSPM2 = 0; SSPM1 = 0; SSPM0 = 0; SSPBUF = 0; // буфер очищен SSPIF = 0; // флаг сброщен SSPEN = 1; // SPI вкл //--------------------------- //компараторы настройка C1CH1 = 1; // С1 на C12IN2- C1OE = 1; // C1OUT наружу C1R = 1; // C1VIN+ внутри C1RSEL = 1; // С1VIN+ на внутреннй цап VR1 C1ON = 1; // С1 вкл C2ON = 1; // С2 вкл //--------------------------- T0IE = 1; // разрешаем прерывания от TMR0 PEIE = 0; // прерывания от переферии невидимы RBIE = 0; // прерывания от портаВ запрещены INTE = 0; // прерывания по инт запрещены GIE = 1; // разрешаем прерывания PWM_ARC=45; } //----------------------------------------------------------- void port_leds(void){ SSPIF = 0; // сбрасываем флаг окончания передачи SPI SSPBUF = PORT; // сначала загружаем в буфер порт сегментов while(!SSPIF); // ждем окончания передачи SSPIF = 0; SSPBUF = DIG; // и загружаем в буфер SPI маску нужного разряда while(!SSPIF); // ждем окончания передачи } //------------------------------------------------ void inttostr(unsigned int tmp) { const unsigned int step[4]={100,10,1,1}; unsigned char i; unsigned int val,temp,atemp; val=tmp; for (i=0; i<4; i++) { temp=step[i]; atemp=0; while(val >= temp) { atemp++; val-=temp; } arr[i]=atemp; } } //------------------------------------------------- unsigned int adc_setIarc(void) { ADFM = 0; // левое выравнивание //----канал АN0 CHS3 = 0; CHS2 = 0; CHS1 = 0; CHS0 = 0; //------------ DelayUs(5); GODONE=1;//запускаем преобразование while (GODONE);//ждем завершения приобразования setIarc = ADRESH; } //------------------------------------------------- unsigned int adc_setIfors(void) { ADFM = 0; // левое выравнивание //----канал АN0 CHS3 = 0; CHS2 = 0; CHS1 = 0; CHS0 = 0; //------------ DelayUs(5); GODONE=1;//запускаем преобразование while (GODONE);//ждем завершения приобразования setIfors = ADRESH; } //------------------------------------------------- unsigned int adc_setIhot_start(void) { ADFM = 0; // левое выравнивание //----канал АN0 CHS3 = 0; CHS2 = 0; CHS1 = 0; CHS0 = 0; //------------ DelayUs(5); GODONE=1;//запускаем преобразование while (GODONE);//ждем завершения приобразования setIfors = ADRESH; } //------------------------------------------------- unsigned int adc_Tkey(void) { ADFM = 1; // правое выравнивание //----канал АN0 CHS3 = 0; CHS2 = 0; CHS1 = 0; CHS0 = 0; //------------ DelayUs(5); GODONE=1;//запускаем преобразование while (GODONE);//ждем завершения приобразования Tkey = ADRESH; } //------------------------------------------------- unsigned int adc_Uout(void) { ADFM = 1; // правое выравнивание //----канал АN0 CHS3 = 0; CHS2 = 0; CHS1 = 0; CHS0 = 0; //------------ DelayUs(5); GODONE=1;//запускаем преобразование while (GODONE);//ждем завершения приобразования Uout = ADRESH; } |
Автор: | Melvin77 [ 25-08, 22:47 ] |
Заголовок сообщения: | |
Извиняюсь, я конечно не пиковод, но вот здается мне что в программах где есть прерывания не желательно использовать "delay" иногда априводит к непредсказуемым результатам. |
Автор: | monos [ 25-08, 23:28 ] |
Заголовок сообщения: | |
Melvin77 писал(а): ... не желательно использовать "delay"
Там всего 5 мксек для зарядки емкости адц, можно, конечно заменить на ассемблерную вставку, только не уверен есть ли смысл... |
Автор: | Melvin77 [ 25-08, 23:39 ] |
Заголовок сообщения: | |
monos Нет это ничего не даст. Дело в том что в хидере #include "delay.h" и есть эти асемблерные вставки, я не асемблерник но помоему cli могу ошибаться. Я вам не смогу професионально объяснить как мне объясняли но что будет если во время выполнения DelayUs(5); случится прерывание особенно не желательно вставлять "делаи" в обработчики прерываний. Я не хочу сказать что именно в этом случае случатся грабли но мне лично когда я Си только начинал ковырять рекомендовали без особой нужды "делаи" не использовать. Да и в книжке так написано. Лучше переменную инкременировать и при достижении события чтото выполнять и обнулять переменную. |
Автор: | monos [ 26-08, 00:23 ] |
Заголовок сообщения: | |
Melvin77 писал(а): Лучше переменную инкременировать и при достижении события чтото выполнять и обнулять переменную.
Так она и инкриминируется, только не теле программы, а в макросе. Тут без задержки ни как не обойтись, и чего-то городить, чтобы выиграть 5 микросек (это 100 тактов фрц или 25 машинных циклов) смысла нет. Единственно, можно тело этого макроса вставлять каждый раз, вместо вызова функции дэлай (чтоб не занимать стэк)... А вообще, все прерывания у меня приходят в определенное время (по тику таймера) и между ними код должен быть уложен в эти временные рамки в обработчике прерывания, а в самом майне ничего не далается... |
Автор: | Melvin77 [ 26-08, 00:44 ] |
Заголовок сообщения: | |
monos Я свое мнение сказал сколько людей столько имнений. Меня так научили в книге так написано, я этому верю. Вы считаете по другому может и так тоже правильно. |
Страница 11 из 13 | Часовой пояс: UTC + 4 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |