Სარჩევი:

Arduino Sinewave ინვერტორებისთვის: 4 ნაბიჯი
Arduino Sinewave ინვერტორებისთვის: 4 ნაბიჯი

ვიდეო: Arduino Sinewave ინვერტორებისთვის: 4 ნაბიჯი

ვიდეო: Arduino Sinewave ინვერტორებისთვის: 4 ნაბიჯი
ვიდეო: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, ივლისი
Anonim
Arduino Sinewave ინვერტორებისთვის
Arduino Sinewave ინვერტორებისთვის

ამ პროექტში მე შევქმენი SPWM (სინუსური ტალღის პულსის ფართო მოდულირებული) სიგნალი ორი arduino pwm ციფრული ამონაწერიდან.

იმის გამო, რომ ასეთი პროგრამის შესაქმნელად მე უნდა ვისაუბრო arduino– ს სხვა ფუნქციებზე და თვისებებზე, სრული პროექტის ჩათვლით, ოსცილოსკოპის სურათებით და სხვადასხვა სიხშირისთვის, გთხოვთ ეწვიოთ ჩემს ვებ გვერდს:

ეპროექტიზონი

ნაბიჯი 1: შექმენით Pwm სიგნალი 50 ჰერცზე

უფრო მაღალი სიხშირით 50Hz სიგნალის შესაქმნელად აუცილებელია გარკვეული გამოთვლების გაკეთება. Arduino– ს სიხშირეები შეიძლება იყოს 8 MHz, მაგრამ ჩვენ გვსურს სიგნალი ცვალებადი ციკლის მქონე.

არდუინოს ცვლადი მოვალეობის ციკლის ტიპების გასაგებად შეგიძლიათ წაიკითხოთ ერთი და იგივე პოსტის 1, 2 და 3 ეს 3 ნაწილი.

დავუშვათ, რომ ჩვენი სიხშირეა 50 ჰც, რაც იმას ნიშნავს, რომ დროის პერიოდი 20 წმ. 10ms არის ნახევარი ციკლის პერიოდი. იმ 10ms ჩვენ გვჭირდება ბევრი pulses სხვადასხვა მოვალეობათა ციკლის დაწყებული მცირე მოვალეობათა ციკლები, შუა სიგნალი ჩვენ გვაქვს მაქსიმალური მოვალეობა ციკლები და დასრულდება ასევე მცირე მოვალეობაა ციკლები. სინუსური ტალღის გენერირებისთვის ჩვენ გამოვიყენებთ ორ ქინძისთავს დადებითი ნახევარი ციკლი და ერთი უარყოფითი ნახევარი ციკლი. ამისთვის ჩვენს პოსტში ჩვენ ვიყენებთ ქინძისთავებს 5 და 6 რაც ნიშნავს ტაიმერს 0.

გლუვი სიგნალისთვის ჩვენ ვირჩევთ ფაზის სწორ pwm სიხშირეს 31372 Hz- იხილეთ წინა პოსტი. ერთ-ერთი ყველაზე დიდი პრობლემა ის არის, თუ როგორ გამოვთვალოთ აუცილებელი მოვალეობა თითოეული პულსისათვის. ასე რომ, რადგან ჩვენი სიხშირე არის f = 31372Hz თითოეული პულსის პერიოდი არის T = 1/31372 = 31.8 us, ამიტომ ნახევარი ციკლისთვის პულსის რაოდენობა არის N = 10ms/31.8us = 314 პულსი. ახლა თითოეული პულსის მოვალეობის ციკლის გამოსათვლელად გვაქვს y = sinx, მაგრამ ამ განტოლებაში ჩვენ გვჭირდება გრადუსი, ასე რომ ნახევარ ციკლს აქვს 180 გრადუსი 314 იმპულსზე. თითოეული პულსისთვის გვაქვს 180/314 = 0.57 გრადუსი/პულსი. ეს ნიშნავს, რომ თითოეული პულსისთვის ჩვენ წინ მივდივართ 0.57 გრადუსით.

y არის მოვალეობის ციკლი და x პოზიციის მნიშვნელობა ნახევარ მოვალეობაში. თავდაპირველად x არის 0, შემდეგ x = 0.57, x = 1.14 და ასე შემდეგ, სანამ x = 180.

თუ ჩვენ გამოვთვლით 314 მნიშვნელობას, ვიღებთ მასივის 314 ელემენტს (ტიპი "int", რომელიც უფრო ადვილად გამოითვლება arduino– ით).

ასეთი მასივი არის:

int sinPWM = {1, 2, 5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 30, 32, 34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 61, 64, 66, 69, 71, 73, 76, 78, 80, 83, 85, 88, 90, 92, 94, 97, 99, 101, 103, 106, 108, 110, 113, 115, 117, 119, 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 178, 180, 182, 184, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 247, 247, 247, 246, 246, 245, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 21 6, 215, 213, 212, 211, 209, 208, 207, 205, 204, 202, 201, 199, 198, 196, 195, 193, 192, 190, 188, 187, 185, 184, 182, 180, 178, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132, 130, 128, 126, 124, 121, 119, 117, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 85, 83, 80, 78, 76, 73, 71, 69, 66, 64, 61, 59, 57, 54, 52, 49, 47, 44, 42, 39, 37, 34, 32, 30, 27, 24, 22, 19, 17, 15, 12, 10, 7, 5, 2, 1};

თქვენ ხედავთ, რომ სინუსური ტალღის მსგავსად, მოვალეობის ციკლი ყველაზე დაბალია პირველ და ბოლო ელემენტში და ყველაზე მაღალი შუაში.

ნაბიჯი 2: Arduino პროგრამა ცვლადი მოვალეობის ციკლისთვის

Arduino პროგრამა ცვლადი მოვალეობის ციკლისთვის
Arduino პროგრამა ცვლადი მოვალეობის ციკლისთვის

ზემოთ მოცემულ სურათზე ჩვენ გვაქვს ცვლადი მოვალეობის ციკლის სიგნალები მასივის მნიშვნელობებით.

მაგრამ როგორ გავაკეთოთ ასეთი სიგნალი ??

ქვემოთ მოყვანილი პროგრამის ნაწილი იყენებს შეფერხებებს მოვალეობების ციკლის მნიშვნელობების შესაცვლელად

sei (); // შეწყვეტის ჩართვა

}

ISR (TIMER1_COMPA_vect) {// შეწყვეტა, როდესაც ტაიმერი 1 ემთხვევა OCR1A მნიშვნელობას

if (i> 313 && OK == 0) {// საბოლოო მნიშვნელობა ვექტორიდან პინ 6 -ისთვის

i = 0; // გადადით ვექტორის (მასივის) პირველ მნიშვნელობაზე

OK = 1; // ჩართეთ pin 5

}

x = sinPWM ; // x ვიღებთ მნიშვნელობას ვექტორიდან, რომელიც შეესაბამება პოზიციას (i არის ნულოვანი ინდექსირებული) -მოვალეობის ციკლის ღირებულება

i = i+1; // გადადით შემდეგ პოზიციაზე

}

ნაბიჯი 3: ალტერნატივა 50Hz არდუინოს ქინძისთავებზე

ალტერნატიული 50Hz არდუინოს ქინძისთავებით
ალტერნატიული 50Hz არდუინოს ქინძისთავებით

იმის გამო, რომ თითოეული პინი წარმოქმნის მხოლოდ ნახევარ სამუშაო ციკლს სინუსური ტალღის შესაქმნელად, ჩვენ ვიყენებთ ორ ქინძისთავს, რომლებიც ერთმანეთის მიყოლებით იცვლება ზუსტად 10 წამის შემდეგ (50 ჰც -ისთვის). ქინძისთავების ეს ცვლილება ხდება მასივის ბოლოს- მას შემდეგ, რაც ვთქვათ, პინ 5-მა გამოიმუშავა 314 პულსი, ეს პინი გამორთულია და ჩართულია პინ 6, რაც იგივეა, მაგრამ უარყოფითი მოვალეობის ციკლისთვის.

იმის გამო, რომ არდუინოს შეუძლია შექმნას მხოლოდ დადებითი სიგნალები, უარყოფითი მოვალეობის ციკლი მზადდება h- ში- ამის შესახებ შეგიძლიათ წაიკითხოთ აქ

ქინძისთავების შეცვლის პროგრამა:

sei (); // შეწყვეტის ჩართვა

}

ISR (TIMER1_COMPA_vect) {// შეწყვეტა, როდესაც ტაიმერი 1 ემთხვევა OCR1A მნიშვნელობას

if (i> 313 && OK == 0) {// საბოლოო მნიშვნელობა ვექტორიდან პინ 6 -ისთვის

i = 0; // გადადით ვექტორის პირველ მნიშვნელობაზე

OK = 1; // ჩართეთ pin 5

}

if (i> 313 && OK == 1) {// საბოლოო მნიშვნელობა ვექტორიდან pin 5 -ისთვის

i = 0; // გადადით ვექტორის პირველ მნიშვნელობაზე

OK = 0; // ჩართეთ pin 6

}

x = sinPWM ; // x აიღეთ მნიშვნელობა i ვექტორიდან შესაბამისი i (i არის ნულოვანი ინდექსირებული)

i = i+1; // გადადით შემდეგ პოზიციაზე

თუ (კარგი == 0) {

OCR0B = 0; // გააკეთეთ pin 5 0

OCR0A = x; // ჩართეთ პინ 6 შესაბამისი სამუშაო ციკლისთვის

თუ (კარგი == 1) {

OCR0A = 0; // გააკეთეთ pin 6 0

OCR0B = x; // ჩართეთ pin 5 შესაბამისი სამუშაო ციკლისთვის

}

}

ნაბიჯი 4: მართეთ H ხიდი და გაფილტრეთ Pwm სიგნალი

არდუინოსგან მიღებული სიგნალები არის ინვერტორული აპლიკაციების საკონტროლო ნაწილი, რადგან ორივე დადებითია. სრული სინუსური ტალღის და პრაქტიკული ინვერტორის შესაქმნელად ჩვენ უნდა გამოვიყენოთ h ხიდი და pwm- ის გასასუფთავებლად დაბალი გავლის ფილტრი.

H- ხიდი აქ არის წარმოდგენილი.

დაბალი გამავლობის ფილტრი შემოწმებულია მცირე ზომის ძრავით-აქ.

გირჩევთ: