İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Bu projede, iki arduino pwm dijital çıkışından bir SPWM (sinüs dalgası darbesi geniş modülasyonlu) sinyali ürettim.
Çünkü böyle bir program yapmak için arduino'nun diğer birçok işlevi ve özellikleri hakkında konuşmam gerekiyor, osiloskop görüntüleri dahil olmak üzere tüm proje ve farklı frekanslar için lütfen web sitemi ziyaret edin:
eprojectszone
Adım 1: 50Hz için Pwm Sinyali Oluşturma
Daha yüksek frekansta 50 Hz'lik bir sinyal üretmek için bazı hesaplamalar yapmak gereklidir. Arduino'dan gelen frekanslar 8MHz'de olabilir, ancak değişken görev döngüsüne sahip bir sinyal istiyoruz.
Arduino'nun değişken görev döngüsü türlerini anlamak için aynı gönderi 1, 2 ve 3'ün bu 3 bölümünü okuyabilirsiniz.
Frekansımızın 50Hz olduğunu varsayalım, bu da zaman periyodunun 20ms olduğu anlamına gelir. Yani 10ms yarım döngü periyodudur. Bu 10ms'de küçük görev döngüleriyle başlayan farklı görev döngülerine sahip birçok darbeye ihtiyacımız var, sinyalin ortasında maksimum görev döngülerimiz var ve ayrıca küçük görev döngüleriyle bitiriyoruz. Bir sinüs dalgası oluşturmak için iki pin kullanacağız. pozitif yarı döngü ve bir negatif yarı döngü için. Bunun için yazımızda Zamanlayıcı 0 anlamına gelen 5 ve 6 numaralı pinleri kullanıyoruz.
Düzgün bir sinyal için 31372 Hz frekansında faz doğru pwm'yi seçiyoruz - önceki gönderiye bakın. En büyük sorunlardan biri, her darbe için gerekli görev döngüsünü nasıl hesapladığımızdır. Yani frekansımız f=31372Hz olduğundan, her darbenin periyodu T=1/31372=31.8 us, yani yarım döngü için darbe sayısı N=10ms/31.8us=314 darbedir. Şimdi her darbe için görev döngüsünü hesaplamak için y=sinx'imiz var, ancak bu denklemde dereceye ihtiyacımız var, bu nedenle yarım döngü 314 darbe için 180 derecedir. Her nabız için 180/314=0.57deg/nabız var. Bu, her darbe için 0,57 derece ile ilerlediğimiz anlamına gelir.
y görev döngüsü ve x yarı görev döngüsündeki konumun değeridir. ilk başta x 0'dır, bundan sonra x=0.57, x=1.14 vb. x= 180'e kadar devam eder.
314 değerin tümünü hesaplarsak, 314 eleman dizisi elde ederiz ("int" yazın, arduino tarafından daha kolay hesaplanır).
Böyle bir dizi:
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, 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, 247, 247, 247, 246, 246, 245, 245, 244, 244, 243, 243, 242, 242, 241, 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};
Bir sinüs dalgası gibi, görev döngüsünün ilk ve son elemanda en düşük ve ortada en yüksek olduğunu görebilirsiniz.
Adım 2: Değişken Görev Döngüsü için Arduino Programı
Yukarıdaki resimde diziden değerlerle değişken görev döngüsü sinyallerine sahibiz.
Ama böyle bir sinyal nasıl yapılır?
programın aşağıdaki kısmı, görev döngülerinin değerlerini değiştirmek için kesintileri kullanır.
sei();// kesmeleri etkinleştir
}
ISR(TIMER1_COMPA_vect){// zamanlayıcı 1, OCR1A değeriyle eşleştiğinde kesintiye uğrar
if(i>313 && OK==0){// pin 6 için vektörden son değer
i=0;// vector(dizi)'nin ilk değerine git
OK=1;//pin 5'i etkinleştir
}
x=sinPWM;// x i pozisyonuna karşılık gelen vektörden değeri alır(i sıfır indekslidir)-görev döngüsünün değeri
i=i+1;// sonraki konuma git
}
Adım 3: 50Hz Arduino Pinlerinde Değişken
Her pin tam sinüs dalgası oluşturmak için sadece yarım görev döngüsü oluşturduğundan, tam 10msaniyeden sonra (50Hz için) birbiri ardına değişen iki pin kullanıyoruz. Bu pin değişikliği dizinin sonunda yapılır - diyelim ki pin 5 314 darbe ürettikten sonra bu pin kapatılır ve negatif görev döngüsü için aynı şeyi yapan pin 6 etkinleştirilir.
Arduino sadece pozitif sinyaller üretebildiğinden, h köprüsünde negatif görev döngüsü yapılır - buradan okuyabilirsiniz
Pin değiştirme programı:
sei();// kesmeleri etkinleştir
}
ISR(TIMER1_COMPA_vect){// zamanlayıcı 1, OCR1A değeriyle eşleştiğinde kesintiye uğrar
if(i>313 && OK==0){// pin 6 için vektörden son değer
i=0;// vektörün ilk değerine git
OK=1;//pin 5'i etkinleştir
}
if(i>313 && OK==1){// pin 5 için vektörden son değer
i=0;//vektörün ilk değerine git
OK=0;//pin 6'yı etkinleştir
}
x=sinPWM;// x i pozisyonuna karşılık gelen vektörden değeri alır(i sıfır indekslidir)
i=i+1;// sonraki konuma git
if(Tamam==0){
OCR0B=0;//pin 5 0 yap
OCR0A=x;//pim 6'yı karşılık gelen görev döngüsüne etkinleştir
eğer(Tamam==1){
OCR0A=0;//pin 6 0 yap
OCR0B=x;//pim 5'i karşılık gelen görev döngüsüne etkinleştir
}
}
Adım 4: Bir H Köprüsü Sürmek ve Pwm Sinyalini Filtrelemek
Arduino'dan elde edilen sinyaller, her ikisi de pozitif olduğu için inverter uygulamalarının kontrol kısmıdır. Tam sinüs dalgası ve pratik bir invertör yapmak için bir h köprüsü kullanmamız ve pwm'yi bir alçak geçiren filtreyi temizlememiz gerekir.
H köprüsü burada sunulmaktadır.
Düşük geçişli filtre, küçük Ac motorlarla test edildi - burada.