ถ้างานเสร็จ
[quote]
[color=#7E7E7E]//Arduino Atmega 1280 Atmega 2560 3 phase induction motor Variable Speed Controller //Code[/color]
[color=#7E7E7E]// Complier By Arduino Version 101 Version 106 Software [/color]
[color=#7E7E7E]//รุ่นนี้เป็นแบบ AUTO RE RUN โค๊ดนี้ใช้วอลลุ่ม 5KB ตัวเดียวทำหน้าที่ ปิด -ปิด ปรับรอบ ให้ใช้ R //4K7 ต่อ ไฟ+5Vdc แล้วต่อเข้า ขาข้างด้าน + MAX ของ VR ต่อ R 1K-10 K ต่อ เข้า A3 ของ //ATmega 168 ATmega 328 P[/color]
#include [color=#006699]"arduino.h"[/color] [color=#7E7E7E]//Store data in flash (program) memory instead of SRAM[/color]
#include [color=#006699]"avr/pgmspace.h"[/color]
#include [color=#006699]"avr/io.h"[/color]
#define cbi(sfr, [color=#CC6600]bit[/color]) (_SFR_BYTE(sfr) &= ~_BV([color=#CC6600]bit[/color]))
#define sbi(sfr, [color=#CC6600]bit[/color]) (_SFR_BYTE(sfr) |= _BV([color=#CC6600]bit[/color]))
#define UN (400.0)
#define FN (50.0)
#define P (UN/FN)
#define T_PWM (0.000255)
#define T_MAX (4.0)
#define T_MIN (0.02)
#define K_MAX [color=#CC6600]floor[/color](T_MAX/T_PWM)
#define K_MIN [color=#CC6600]ceil[/color](T_MIN/T_PWM)
volatile [color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] dlugosc_tab_sin; [color=#7E7E7E]//okresie napiecia wyjsciowego[/color]
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] i = 0;
volatile [color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] licznik_glowny = 0;
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] next_value_sin = 0;
[color=#CC6600]static[/color] [color=#CC6600]double[/color] t_param=100;
[color=#CC6600]static[/color] [color=#CC6600]float[/color] t = T_PWM;
[color=#CC6600]static[/color] [color=#CC6600]float[/color] omega_t;
[color=#CC6600]static[/color] [color=#CC6600]float[/color] t_out;
[color=#CC6600]static[/color] [color=#CC6600]float[/color] U_o_param;
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] ocr0a, ocr0b, ocr1a;
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] ocr1b, ocr2a, ocr2b;
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] ocr3a, ocr3b, ocr3c;
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] ocr4a, ocr4b, ocr4c;[color=#7E7E7E]//^[/color]
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] ocr5a, ocr5b, ocr5c;[color=#7E7E7E]//[/color]
[color=#CC6600]static[/color] [color=#CC6600]double[/color] sin_in;
[color=#CC6600]static[/color] [color=#CC6600]double[/color] blad = 1;
[color=#CC6600]static[/color] [color=#CC6600]unsigned[/color] [color=#CC6600]int[/color] analog=0;
[color=#CC6600]static[/color] [color=#CC6600]double[/color] U_in = 0;
[color=#CC6600]static[/color] [color=#CC6600]double[/color] U_rms_max;
[color=#CC6600]static[/color] bool a=0;
[color=#CC6600]int[/color] main()
{
io_init();
timers_init(); [color=#7E7E7E]//inicjalizacja licznikow PWM [/color]
adc_init(); [color=#7E7E7E]//inicjalizacja przetwornika ADC[/color]
[color=#CC6600]while[/color](1) [color=#7E7E7E]//nieskonczona petla z programem glownym[/color]
{
[color=#CC6600]if[/color](i==185) [color=#7E7E7E]//warunek okreslajacy wejscie do funkcji zmiany [/color]
{ [color=#7E7E7E]//parametrow napiecia wysjciowego, wywolanie co okolo 100ms[/color]
zmien_predkosc(); [color=#7E7E7E]//funkcja zmiany parametrow napiecia wyjsciowego[/color]
i=0;
}
next_value_sin = licznik_glowny%dlugosc_tab_sin; [color=#7E7E7E]//kolejna wartoœๆ sinusa do obliczenia[/color]
sin_in=omega_t*next_value_sin;
[color=#7E7E7E]//obliczenie wartosci do rejestrow okreslajacych wypelnienie sygnalu wyjscioweg/[/color]
ocr0a = [color=#CC6600]round[/color](blad*(U_o_param*([color=#CC6600]sin[/color](sin_in)+1)*254/2)+1);[color=#7E7E7E]//pin D 13[/color]
ocr0b = ocr0a - 1;[color=#7E7E7E]//pin D 4[/color]
ocr1a = [color=#CC6600]round[/color](blad*(U_o_param*([color=#CC6600]sin[/color](sin_in-2.09)+1)*254/2)+1);[color=#7E7E7E]//pin D 11[/color]
ocr1b = ocr1a - 1;[color=#7E7E7E]//pin D 12[/color]
ocr2a = [color=#CC6600]round[/color](blad*(U_o_param*([color=#CC6600]sin[/color](sin_in+2.09)+1)*254/2)+1);[color=#7E7E7E]//pin D 10[/color]
ocr2b = ocr2a - 1;[color=#7E7E7E]//pin D 9[/color]
ocr3a = [color=#CC6600]round[/color](blad*(U_o_param*([color=#CC6600]sin[/color](sin_in)+1)*254/2)+1);[color=#7E7E7E]//pin D 5[/color]
ocr3b = ocr0b;[color=#7E7E7E]//ocr3a - 1;//pin D 2[/color]
ocr3c = [color=#CC6600]round[/color](blad*(U_o_param*([color=#CC6600]sin[/color](sin_in-2.09)+1)*254/2)+1);[color=#7E7E7E]//pin D 3[/color]
ocr4a = ocr2b;[color=#7E7E7E]//ocr3c - 1;//pin D 6[/color]
ocr4b = [color=#CC6600]round[/color](blad*(U_o_param*([color=#CC6600]sin[/color](sin_in+2.09)+1)*254/2)+1);[color=#7E7E7E]//pin D 7[/color]
ocr4c = ocr1b ; [color=#7E7E7E]//pin D 8[/color]
ocr5a = ocr0b;[color=#7E7E7E]//round(blad*(U_o_param*(sin(sin_in)+1)*254/2)+1);//pin D 46[/color]
ocr5b = ocr1b;[color=#7E7E7E]//round(blad*(U_o_param*(sin(sin_in+2.09)+1)*254/2)+1);//pin D 45[/color]
ocr5c = ocr2b;[color=#7E7E7E]//round(blad*(U_o_param*(sin(sin_in-2.09)+1)*254/2)+1);//pin D 44[/color]
[color=#7E7E7E]//uaktualnienie wartosci w rejestrach/[/color]
cli(); [color=#7E7E7E]//zabronienie na obsloge przerwan na wypadek gdyby [/color]
[color=#7E7E7E]//podczas uaktualniania wystapilo przerwanie[/color]
OCR0A = ocr0a; [color=#7E7E7E]//pin 6[/color]
OCR0B = ocr0b; [color=#7E7E7E]//pin 5[/color]
OCR1AL = ocr1a; [color=#7E7E7E]//pin 9[/color]
OCR1BL = ocr1b; [color=#7E7E7E]//pin 10[/color]
OCR2A = ocr2a; [color=#7E7E7E]//pin 11[/color]
OCR2B = ocr2b; [color=#7E7E7E]//pin 3[/color]
OCR3A = ocr3a; [color=#7E7E7E]//pin 6[/color]
OCR3B = ocr3b; [color=#7E7E7E]//pin 5[/color]
OCR3CL = ocr3c; [color=#7E7E7E]//pin 3[/color]
OCR4AL = ocr4a; [color=#7E7E7E]//pin 10[/color]
OCR4B = ocr4b; [color=#7E7E7E]//pin 11[/color]
OCR4C = ocr4c; [color=#7E7E7E]//pin 8[/color]
OCR5A = ocr5a; [color=#7E7E7E]//pin 10[/color]
OCR5B = ocr5b; [color=#7E7E7E]//pin 11[/color]
OCR5C = ocr5c; [color=#7E7E7E]//pin 8[/color]
sei(); [color=#7E7E7E]//zezwolenie na obsloge przerwan[/color]
i++;
}
}
[color=#CC6600]void[/color] adc_init()
{
ADCSRA |= _BV(ADEN);[color=#7E7E7E]//uruchomienie przetwornika[/color]
ADCSRA |= _BV(ADPS2);[color=#7E7E7E]//ustawienie preskalera[/color]
ADCSRA |= _BV(ADPS1);[color=#7E7E7E]//^[/color]
ADCSRA |= _BV(ADPS0);[color=#7E7E7E]//^[/color]
ADMUX |= _BV(REFS0);[color=#7E7E7E]// napiecie odniesienia ustawione jako napiecie zasilania[/color]
ADMUX |= ADMUX &= 0b11110000; [color=#7E7E7E]//wybranie wejscia ADC0 do pomiaru[/color]
}
[color=#CC6600]void[/color] timers_init()
{
cli(); [color=#7E7E7E]// obsloga przerwan zabroniona[/color]
TCCR0A |= _BV(COM0A1) | _BV(COM0B0) | _BV(COM0B1) | _BV(WGM00);
TCCR0B |= _BV(CS01); [color=#7E7E7E]//preskaler 8[/color]
TIMSK0 |= _BV(TOIE0); [color=#7E7E7E]//flaga od wartosci 0 wlaczona[/color]
[color=#7E7E7E]//timer1 init[/color]
TCCR1A |= _BV(COM1A1) | _BV(COM1B0) | _BV(COM1B1) | _BV(WGM10);
TCCR1B |= _BV(CS11); [color=#7E7E7E]//preskaler 8[/color]
[color=#7E7E7E]//timer2 init[/color]
TCCR2A |= _BV(COM2A1) | _BV(COM2B0) | _BV(COM2B1) | _BV(WGM20);
TCCR2B |= _BV(CS21); [color=#7E7E7E]//preskaler 8[/color]
[color=#7E7E7E]//timer3 init[/color]
TCCR3A |= _BV(COM3A1) | _BV(COM3B0) | _BV(COM3B1) | _BV(WGM30);
TCCR3B |= _BV(CS31);
TCCR3C |= _BV(COM3A1) | _BV(COM3B0) | _BV(COM3B1) | _BV(WGM33);
TCCR3C |= _BV(CS31);[color=#7E7E7E]//;|(1 << CS00); //preskaler 8[/color]
cbi (TCCR3A, COM3C0);
sbi (TCCR3A, COM3C1);
[color=#7E7E7E]//timer4 init[/color]
TCCR4A |= _BV(COM4A1) | _BV(COM4B0) | _BV(COM4B1) | _BV(WGM40);
TCCR4B |= _BV(CS41);
TCCR4C |= _BV(CS40); [color=#7E7E7E]//preskaler 8 [/color]
cbi (TCCR4A, COM4C0);
sbi (TCCR4A, COM4C1);
[color=#7E7E7E]//timer5 init[/color]
TCCR5A |= _BV(COM5A1) | _BV(COM5B0) | _BV(COM5B1) | _BV(WGM50);
TCCR5B |= _BV(CS51); [color=#7E7E7E]//preskaler 8 [/color]
TCCR5C |= _BV(CS51);
cbi (TCCR5A, COM5C0);
sbi (TCCR5A, COM5C1);
[color=#7E7E7E]//zerowanie wartosci licznik๓w[/color]
TCNT0 = 0;
TCNT1L = 0;
TCNT2 = 0;
sei(); [color=#7E7E7E]//zezwolenie na obsloge przerwan[/color]
}
[color=#CC6600]void[/color] io_init()
{
[color=#CC6600]pinMode[/color](6, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC0A[/color]
[color=#CC6600]pinMode[/color](5, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC0B[/color]
[color=#CC6600]pinMode[/color](9, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC1A[/color]
[color=#CC6600]pinMode[/color](10, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC1B[/color]
[color=#CC6600]pinMode[/color](11, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC2A[/color]
[color=#CC6600]pinMode[/color](3, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC3C[/color]
[color=#CC6600]pinMode[/color](52, [color=#006699]INPUT[/color]);
[color=#CC6600]pinMode[/color](53, [color=#006699]INPUT[/color]);
[color=#CC6600]pinMode[/color](50, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](2, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC3B[/color]
[color=#CC6600]pinMode[/color](4, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC0B[/color]
[color=#CC6600]pinMode[/color](7, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC1A[/color]
[color=#CC6600]pinMode[/color](8, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC4C[/color]
[color=#CC6600]pinMode[/color](12, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC2A[/color]
[color=#CC6600]pinMode[/color](13, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC2B[/color]
[color=#CC6600]pinMode[/color](44, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC4C[/color]
[color=#CC6600]pinMode[/color](45, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC2A[/color]
[color=#CC6600]pinMode[/color](46, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC2B[/color]
[color=#CC6600]pinMode[/color](A3, [color=#006699]INPUT[/color]); [color=#7E7E7E]//OC1A[/color]
[color=#CC6600]pinMode[/color](A4, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC1B[/color]
[color=#CC6600]pinMode[/color](A5, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC2A[/color]
[color=#CC6600]pinMode[/color](A6, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC3C[/color]
[color=#CC6600]pinMode[/color](A1, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](A0, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](A9, [color=#006699]OUTPUT[/color]);
[color=#CC6600]pinMode[/color](A10, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC0A[/color]
[color=#CC6600]pinMode[/color](A11, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC0B[/color]
[color=#CC6600]pinMode[/color](A12, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC1A[/color]
[color=#CC6600]pinMode[/color](A13, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC4C[/color]
[color=#CC6600]pinMode[/color](A14, [color=#006699]OUTPUT[/color]);[color=#7E7E7E]//OC2A[/color]
[color=#CC6600]pinMode[/color](A15, [color=#006699]OUTPUT[/color]); [color=#7E7E7E]//OC2B[/color]
}
ISR(TIMER0_OVF_vect) [color=#7E7E7E]//przerwanie przy wartosci 0 licznika0 [/color]
{
analog = ADC;
[color=#CC6600]if[/color](a)
{
U_in = 0.0709*analog;
ADMUX |= _BV(MUX0); [color=#7E7E7E]//wybranie wejscia ADC1 do pomiaru pradu [/color]
}
[color=#CC6600]else[/color]
{
ADMUX |= ADMUX &= 0b11110000; [color=#7E7E7E]//wybranie wejscia ADC0 do pomiaru napiecia[/color]
[color=#CC6600]if[/color](analog>579)
{
blad = 0; [color=#7E7E7E]//jezeli przeciazenie wylaczenie generacji napiecia[/color]
[color=#CC6600]digitalWrite[/color](50, [color=#006699]HIGH[/color]); [color=#7E7E7E]//zapalenie diody [/color]
}
}
ADCSRA |= _BV(ADSC);[color=#7E7E7E]//start odczytywania pomiaru[/color]
a=a^1; [color=#7E7E7E]//bramka XOR neguje wartosc logiczna a [/color]
licznik_glowny++;
[color=#CC6600]if[/color](licznik_glowny>=dlugosc_tab_sin) licznik_glowny = 0;
}
[color=#CC6600]void[/color] zmien_predkosc()
{
t_param = [color=#CC6600]map[/color]([color=#CC6600]analogRead[/color](3),0,1023,0,100);
U_rms_max = U_in*0.62;
bool up;
bool down;
up = [color=#CC6600]digitalRead[/color](52);
down = [color=#CC6600]digitalRead[/color](53);
[color=#CC6600]if[/color](up==1) t_param--;
[color=#CC6600]if[/color](down==1) t_param++;
[color=#CC6600]if[/color](t_param<0) t_param=0;
[color=#CC6600]if[/color](t_param>100) t_param=100;[color=#7E7E7E]//^[/color]
dlugosc_tab_sin = [color=#CC6600]ceil[/color]((K_MAX-K_MIN)*t_param/500+K_MIN);[color=#7E7E7E]//ilosc wartosci wypelnien w jednym okresie[/color]
t_out = T_PWM*dlugosc_tab_sin; [color=#7E7E7E]//obliczenie okresu napiecia wyjsciowego[/color]
omega_t = t*2*[color=#006699]PI[/color]/t_out; [color=#7E7E7E]//obliczenie pulsacji napiecia wyjsciowego[/color]
U_o_param = (P/t_out)/U_rms_max; [color=#7E7E7E]//obliczenie parametru okreslajacego wielkosc napiecia wyjsciowego[/color]
[color=#CC6600]if[/color](t_out>1) U_o_param = 0.5*(18.5/U_rms_max); [color=#7E7E7E]//napi๊cie na wyjsciu przy niskiej czestotliwosci 10V[/color]
[color=#CC6600]if[/color](U_o_param>1) U_o_param=1;
[color=#7E7E7E]//zabezpieczenie przekroczenia wartosci skrajnych[/color]
blad = 1; [color=#7E7E7E]//jezeli przeciazenie wylaczenie generacji napiecia[/color]
[color=#CC6600]digitalWrite[/color](50, [color=#006699]LOW[/color]); [color=#7E7E7E]//zapalenie diody [/color]
}
[/quote]
ความคิดเห็น
แสดงความคิดเห็น