İçindekiler:
- 1. Adım: Gösteri
- 2. Adım: Kullanılan Kaynaklar
- Adım 3: Blok Şeması
- Adım 4: Şema
- Adım 5: LM386 - Sabitleme
- Adım 6: AmpOp - Diferansiyel (çıkarıcı)
- Adım 7: AmpOp - İnverter Toplayıcı
- Adım 8: Akçaağaç Mini - Pinage
- Adım 9: Maple Mini - Sabitleme - a / D Yakalamada Kullanılan
- Adım 10: Montaj
- Adım 11: Elde Edilen Verilerle Grafik Oluşturun
- Adım 12: RMS Değerinin Hesaplanması
- Adım 13: Kaynak Kodu
- Adım 14: Dosyalar
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
Bugün AC okuması yapmak için STM32 Maple Mini'yi kullanacağız. Örneğimizde, elektrik şebekesinin RMS değerini alacağız. Bu, Nesnelerin İnterneti için elektrik şebekesini izlemek isteyenler için çok kullanışlıdır. Daha sonra Maple Mini'nin hesaplama gücünü kullanarak bir uygulama oluşturacağız, 127Vac sinyalinin alınmasına izin verebilecek bir elektronik devre uygulayacağız ve ayrıca numuneler üzerinde ortalama kare (RMS) hesaplamasını uygulayacağız.
1. Adım: Gösteri
Bugünkü montajımızda analog devremize ek olarak 110 adet giriş yapmak için STM32 bulunmaktadır. Şoklardan korunmak için 110 ile giren direnci izole ediniz.
Devre oldukça hassastır. 110 ile giriyorum ama voltaj bölücü kullanarak 168 kat azaltıyorum ve birkaç işlevi olan işlemsel yükselticiye koyuyorum.
Ayrıca kaynak filtreleme için bazı isteğe bağlı kapasitörlerimiz var. Kaynağınız kaliteliyse bunları kullanmanıza gerek yoktur.
AD girişi, 110 olmayan (ancak iyi biçimlendirilmiş) bir sinüzoid gördüğünüz osiloskop aracılığıyla hesaplanır. Başka bir şey de, elektrik şebekemizdeki voltajın 110 değil (aslında 127 volt). Ancak bir stabilizatörden geçerken 115V'a ayarlanacaktır.
Seri monitörde görüntülenen değer, RMS'de hesaplanan, yani Fluke Meter tarafından tanımlanan değerdir.
2. Adım: Kullanılan Kaynaklar
• Süveterler
• Mini Akçaağaç
• Ana kart
• Bir LM386 amplifikatörü
• Simetrik bir kaynak (+ 5V ve -5V)
• 10k çok turlu trimpot (veya potansiyometre)
• 100nF polyesterden dört kapasitör
• Üç adet 10k direnç
• Dört 470k direnç
• Bir adet 5k6 direnç
• Bir adet 1n4728A zener diyot
Adım 3: Blok Şeması
Adım 4: Şema
Bu, bu ölçüm için en iyisi olduğuna inandığım özelliklere dayanarak geliştirdiğim bir devre, ancak internette bulunabilecek birkaç başka örnek var.
Adım 5: LM386 - Sabitleme
LM386, koşullandırma veya sinyal amplifikasyonu için iki amplifikatöre sahiptir.
Adım 6: AmpOp - Diferansiyel (çıkarıcı)
Adım 7: AmpOp - İnverter Toplayıcı
Adım 8: Akçaağaç Mini - Pinage
İşaretli pinler:
Kırmızı >> 3V3 Toleranslı
Yeşil >> 5V Toleranslı
Adım 9: Maple Mini - Sabitleme - a / D Yakalamada Kullanılan
Burada, kullandığım pimin (STMicroelectronics terminolojisinde) PA0 olan D11 olduğunu vurguluyorum.
Adım 10: Montaj
Devremiz için, bu proje için oluşturduğumuz gibi simetrik bir kaynağa ihtiyacınız olacak. Aksi takdirde, iki kaynağa ihtiyacınız olacak.
Adım 11: Elde Edilen Verilerle Grafik Oluşturun
Adım 12: RMS Değerinin Hesaplanması
Adım 13: Kaynak Kodu
Kaynak kodu - Tanımlar ve sabitler
İlk başta pin okumasını D11 olarak ve hesaplamalarda kullanılan çeşitli sabitleri tanımladık.
#define leituraTensao D11 //AD CH0 pino yok PA0 //valor teórico bölen de tensão = 168.85714285714285714286 const float fatorBölen = 168.40166345742404792461; //valor terorico do ganho de amplificação = 1.0 const float fatorAmplificador = 1.0; //Valor usado na multiplicação da leitura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; //Valor teórico on Tensão de alimentação Vcc = 3,3V sabit kayan nokta Vcc = 3,3; // valor teórico ofset yapmak amplificador = Vcc / 2.0; const kayan nokta offSet = 1.66; // daha fazla bilgi için AD = 3.3 / 4095.0 sabit kayan nokta AD = Vcc / 4095.0; const int amostras = 71429; //sonuç em 1, 027 segundos para cada atualização //const int amostras = 35715; //resulta em 0, 514 segundos para cada atualização
Kaynak kodu - Genel değişkenler
Şimdi, bazı global değişkenleri tanımlıyoruz.
kayan Vrms = 0.0; //armaze veya valor rms da tensãofloat Vmax = 0.0; //armazena veya valor maksimo detektif kayan nokta Vmin = 10000.0; //armazena veya valor mínimo detektif kayan nokta Vmed = 0.0; //armazena veya valor médio entre Vmáx e Vmín
Kaynak Kodu - Kurulum ()
Seri bağlantı noktasını 1 Mbps'de başlatın. AD portunu girdi olarak ayarladık ve veri toplamaya başlamadan önce 5 saniye bekledik. Bekleme süresi isteğe bağlıdır.
geçersiz kurulum() { Serial.begin(1000000); //inicia bir porta seri em 1Mbps pinMode(leituraTensao, INPUT); // AD como giriş gecikmesini bir porta ayarlayın(5000); // bir coleta'ya karşı koruma 5s antes de iniciar. (isteğe bağlı) }
Kaynak Kodu - Döngü () - Veri toplama değişkenlerini başlatır
Döngüde, yineleme için değişkenimiz var. Burada ayrıca AD okumalarını 0.0'da saklarız ve VRMS değişkenini 0.0'da yeniden başlatırız.
geçersiz döngü() { int ben = 0; //değişken para iteração float leitura = 0.0; //armazena as leituras yapmak AD Vrms = 0.0; // reinicia bir değişken Vrms
Kaynak Kodu - Her örnek için ayrı hesaplamaları yakalar ve yürütür
Bu aşamada i örneklemden küçük ise i örnek sayısına ulaşana kadar örnekleme döngüsüne başlarız. Analog portu okumak ve okuma voltajlarının karelerinin toplamını hesaplamak için analogRead çalıştırırız. Son olarak, yineleyiciyi artırıyoruz.
while (i < amostras) { //inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead(leituraTensao); //bir bağlantı noktası analógica //Serial.println(leitura); // AD Vrms = Vrms + pow(((leitura * fatorAD) - ofset), 2.0); //bir soma dos quadrados das tensões lidas i++; //artırma veya yineleme }
Kaynak kodu - Örneklerin genel hesaplamaları ve maksimum, minimum ve ortalamanın tanımlanması
Gerilimlerin gerçek değerini belirlemek için çarpma gerçeğini uygularız. Değerin maksimum veya minimum olduğunu tespit eder ve mevcut maksimum ve minimum değerlerin ortalamasını hesaplarız.
// Gerçek değerlerin gerçek değerlerinin birden fazla belirleyicisi için geçerli olmak Vrms = (sqrt(Vrms / amostras)) * fatorMultiplicacao; //detecta se é um valor é máximo if (Vrms > Vmax) { Vmax = Vrms; } //detecta se é um valor mínimo if (Vrms < Vmin) { Vmin = Vrms; } //bir medya dos valores máximo ve mínimo atuais Vmed = (Vmax + Vmin) / 2.0;
Kaynak Kodu - Çıkış Seçenekleri
Çıktı değerini "çizmek" için üç seçeneğimiz var. CSV veya Jason gibi Arduino IDE seri çizicisine biçimlendirilmiş çıktılarımız var.
//saída formatada para çizici seri IDE Arduino Serial.print(Vrms, 3); Seri.print(", "); Seri.baskı(Vmax, 3); Seri.print(", "); Serial.print(Vmin, 3); Seri.print(", "); Serial.println(Vmed, 3); /* // formatada ortak json Serial.print("{"anında(ms)\":"); Serial.print(millis()); Seri.print(", "); Serial.print("\"Vrms(V)\":"); Serial.print(Vrms, 3); Seri.print(", "); Serial.print("\"Vmax(V)\":"); Seri.baskı(Vmax, 3); Seri.print(", "); Serial.print("\"Vmin(V)\":"); Serial.print(Vmin, 3); Seri.print(", "); Serial.print("\"Vmed(V)\":"); Serial.print(Vmed, 3); Seri.println("}"); */ /* //CSV Serial.print(millis()); Seri.print(", "); Serial.print(Vrms, 3); Seri.print(", "); Seri.baskı(Vmax, 3); Seri.print(", "); Serial.print(Vmin, 3); Seri.print(", "); Serial.println(Vmed, 3); */ }
Adım 14: Dosyalar
Dosyaları indirin:
BEN HAYIR