สารบัญ:
- ขั้นตอนที่ 1: การสาธิต
- ขั้นตอนที่ 2: ทรัพยากรที่ใช้
- ขั้นตอนที่ 3: บล็อกไดอะแกรม
- ขั้นตอนที่ 4: โครงการ
- ขั้นตอนที่ 5: LM386 - การตรึง
- ขั้นตอนที่ 6: AmpOp - ดิฟเฟอเรนเชียล (ตัวลบ)
- ขั้นตอนที่ 7: AmpOp - อินเวอร์เตอร์ Adder
- ขั้นตอนที่ 8: Maple Mini - Pinage
- ขั้นตอนที่ 9: Maple Mini - การตรึง - a / D ที่ใช้ในการจับภาพ
- ขั้นตอนที่ 10: การประกอบ
- ขั้นตอนที่ 11: สร้างกราฟด้วยข้อมูลที่ได้รับ
- ขั้นตอนที่ 12: การคำนวณค่า RMS
- ขั้นตอนที่ 13: รหัสที่มา
- ขั้นตอนที่ 14: ไฟล์
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
วันนี้ เราจะใช้ STM32 Maple Mini ในการอ่านค่า AC ในตัวอย่างของเรา เราจะได้ค่า RMS ของโครงข่ายไฟฟ้า สิ่งนี้มีประโยชน์มากสำหรับผู้ที่ต้องการตรวจสอบเครือข่ายไฟฟ้าสำหรับ Internet of Things จากนั้นเราจะสร้างแอปพลิเคชันโดยใช้กำลังในการคำนวณของ Maple Mini ใช้วงจรอิเล็กทรอนิกส์ที่ยอมให้รับสัญญาณ 127Vac ได้ และใช้การคำนวณหาค่าเฉลี่ยรูต (RMS) กับตัวอย่าง
ขั้นตอนที่ 1: การสาธิต
ในการประกอบของเราวันนี้ เรามี STM32 นอกเหนือจากวงจรแอนะล็อกของเราเพื่อให้อินพุตเป็น 110 เพื่อหลีกเลี่ยงแรงกระแทก ให้แยกตัวต้านทานที่ป้อน 110
วงจรค่อนข้างไว ฉันกำลังเข้าสู่ 110 แต่ฉันลดมันลง 168 เท่าโดยใช้ตัวแบ่งแรงดันไฟฟ้าและใส่ลงในแอมพลิฟายเออร์สำหรับการดำเนินงานซึ่งมีฟังก์ชั่นหลายอย่าง
นอกจากนี้เรายังมีตัวเก็บประจุเสริมสำหรับการกรองแหล่งที่มา หากแหล่งที่มาของคุณมีคุณภาพดี คุณก็ไม่จำเป็นต้องใช้
อินพุต AD คำนวณผ่านออสซิลโลสโคป ซึ่งคุณจะเห็นไซนัสอยด์ ซึ่งไม่ใช่ 110 (แต่มีรูปร่างที่ดี) อีกอย่างคือแรงดันไฟฟ้าในเครือข่ายไฟฟ้าของเราไม่ใช่ 110 (จริงๆ แล้วคือ 127 โวลต์) แต่ในขณะที่เรากำลังทำสเตบิไลเซอร์ มันจะปรับเป็น 115V
ค่าที่แสดงบนจอภาพอนุกรมคือสิ่งที่คำนวณใน RMS นั่นคือค่าที่ Fluke Meter ระบุ
ขั้นตอนที่ 2: ทรัพยากรที่ใช้
• จัมเปอร์
• เมเปิ้ล มินิ
• โปรโตบอร์ด
• เครื่องขยายเสียง LM386
• แหล่งสัญญาณแบบสมมาตร (+ 5V และ -5V)
• ทริมพอตแบบหมุนหลายรอบ 10k (หรือโพเทนชิออมิเตอร์)
• ตัวเก็บประจุสี่ตัวโพลีเอสเตอร์ 100nF
• ตัวต้านทาน 10k สามตัว
• ตัวต้านทาน 470k สี่ตัว
• ตัวต้านทาน 5k6 หนึ่งตัว
• ซีเนอร์ไดโอด 1n4728A หนึ่งตัว
ขั้นตอนที่ 3: บล็อกไดอะแกรม
ขั้นตอนที่ 4: โครงการ
นี่คือวงจรที่ฉันพัฒนาขึ้นโดยอิงตามข้อกำหนดที่ฉันเชื่อว่าดีที่สุดสำหรับการวัดนี้ แต่มีตัวอย่างอื่นๆ อีกหลายตัวอย่างที่สามารถพบได้บนอินเทอร์เน็ต
ขั้นตอนที่ 5: LM386 - การตรึง
LM386 มีแอมพลิฟายเออร์สองตัวสำหรับการปรับสภาพหรือการขยายสัญญาณ
ขั้นตอนที่ 6: AmpOp - ดิฟเฟอเรนเชียล (ตัวลบ)
ขั้นตอนที่ 7: AmpOp - อินเวอร์เตอร์ Adder
ขั้นตอนที่ 8: Maple Mini - Pinage
หมุดที่ทำเครื่องหมายไว้:
สีแดง >> ความทนทาน 3V3
สีเขียว >> 5V Tolerant
ขั้นตอนที่ 9: Maple Mini - การตรึง - a / D ที่ใช้ในการจับภาพ
ฉันเน้นที่นี่ว่าพินที่ฉันใช้คือ D11 ที่ (ในระบบการตั้งชื่อของ STMicroelectronics) คือ PA0
ขั้นตอนที่ 10: การประกอบ
สำหรับวงจรของเรา คุณจะต้องมีแหล่งสัญญาณแบบสมมาตร เช่นเดียวกับที่เราสร้างขึ้นสำหรับโครงการนี้ มิฉะนั้น คุณจะต้องใช้สองแหล่ง
ขั้นตอนที่ 11: สร้างกราฟด้วยข้อมูลที่ได้รับ
ขั้นตอนที่ 12: การคำนวณค่า RMS
ขั้นตอนที่ 13: รหัสที่มา
ซอร์สโค้ด - คำจำกัดความและค่าคงที่
ในตอนแรก เรากำหนดการอ่านพินเป็น D11 รวมถึงค่าคงที่ต่างๆ ที่ใช้ในการคำนวณ
#define leituraTensao D11 //AD CH0 no pino PA0 //valor teórico divisor de tensão = 168.85714285714285714286 const float fatorDivisor = 168.40166345742404792461; //valor teórico do ganho de amplificação = 1.0 const float fatorAmplificador = 1.0; //ความกล้าหาญใช้ na multiplicação da leitura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; // Valor teórico da Tensão de alimentação Vcc = 3.3V const float Vcc = 3.3; //valor teórico ทำ offset do amplificador = Vcc / 2.0; const float offSet = 1.66; //fator teórico da conversão do AD = 3.3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; //resulta em 1, 027 segundos para cada atualização //const int amostras = 35715; //resulta em 0, 514 segundos สำหรับ cada atualização
ซอร์สโค้ด - ตัวแปรโกลบอล
ตอนนี้ เรากำหนดตัวแปรส่วนกลางบางตัว
float Vrms = 0.0; //armazena หรือ ความกล้าหาญ rms da tensãofloat Vmax = 0.0; //armazena หรือ valor máximo detectado float Vmin = 1,0000.0; //armazena หรือ valor mínimo detectado float Vmed = 0.0; //armazena o valor médio entre Vmáx e Vmín
ซอร์สโค้ด - การตั้งค่า ()
เริ่มพอร์ตอนุกรมที่ 1Mbps เราปรับพอร์ต AD เป็นอินพุตและรอ 5 วินาทีก่อนที่จะเริ่มรวบรวมข้อมูล เวลาสแตนด์บายเป็นตัวเลือก
การตั้งค่าเป็นโมฆะ () { Serial.begin (1000000); //inicia พอร์ตอนุกรม em 1Mbps pinMode (leituraTensao, INPUT); //ajusta a porta do AD como entrada ล่าช้า (5000); //aguarda 5s antes de iniciar a coleta. (ไม่บังคับ) }
Source Code - Loop () - เริ่มการรวบรวมข้อมูลตัวแปร
ในลูป เรามีตัวแปรสำหรับการวนซ้ำ ที่นี่ เรายังเก็บการอ่าน AD ใน 0.0 และรีสตาร์ทตัวแปร VRMS ด้วย 0.0
วงเป็นโมฆะ () { int i = 0; //ตัวแปรพารา iteração float leitura = 0.0; //armazena เป็น leituras ทำ AD Vrms = 0.0; //reinicia a variável Vrms
ซอร์สโค้ด - จับและดำเนินการคำนวณแต่ละรายการสำหรับแต่ละตัวอย่าง
ในขั้นตอนนี้ หาก i น้อยกว่ากลุ่มตัวอย่าง เราจะเริ่มรอบการสุ่มตัวอย่างจนกว่า i จะถึงจำนวนตัวอย่าง เราเรียกใช้ analogRead เพื่ออ่านพอร์ตแอนะล็อกและคำนวณผลรวมของกำลังสองของแรงดันไฟฟ้าที่อ่านได้ สุดท้าย เราเพิ่มตัววนซ้ำ
ในขณะที่ (ฉัน < amostras) (//inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead (leituraTensao); // lê a porta analógica //Serial.println(leitura); //Descomente se quiser ver o sinal bruto do AD Vrms = Vrms + pow(((leitura * fatorAD) - offSet), 2.0); //คำนวณ a soma dos quadrados das tensões lidas i++; //incrementa o iterador }
ซอร์สโค้ด - การคำนวณทั่วไปของกลุ่มตัวอย่างและการระบุค่าสูงสุด ต่ำสุด และค่าเฉลี่ย
เราใช้ข้อเท็จจริงการคูณเพื่อกำหนดมูลค่าที่แท้จริงของแรงดันไฟฟ้า เราตรวจพบว่าค่าสูงสุดหรือต่ำสุด และเราคำนวณค่าเฉลี่ยของค่าสูงสุดและต่ำสุดในปัจจุบัน
//Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt(Vrms / amostras)) * fatorMultiplicacao; //detecta se é um valor é máximo ถ้า (Vrms > Vmax) { Vmax = Vrms; } //detecta se é um valor mínimo ถ้า (Vrms < Vmin) { Vmin = Vrms; } //คำนวณจากสื่อ dos valores máximo e mínimo atuais Vmed = (Vmax + Vmin) / 2.0;
ซอร์สโค้ด - ตัวเลือกเอาต์พุต
เรามีสามตัวเลือกสำหรับ "การพล็อต" ค่าเอาต์พุต เราได้ฟอร์แมตเอาต์พุตเป็นพล็อตเตอร์อนุกรม Arduino IDE เช่น CSV หรือ Jason
// รูปแบบสำหรับพล็อตเตอร์อนุกรม IDE Arduino Serial.print (Vrms, 3); Serial.print(", "); Serial.print(Vmax, 3); Serial.print(", "); Serial.print(Vmin, 3); Serial.print(", "); Serial.println(Vmed, 3); /* //saída formatada como json Serial.print("{"instante(ms)\":"); Serial.print(มิลลิวินาที()); Serial.print(", "); Serial.print("\"Vrms(V)\":"); Serial.print(Vrms, 3); Serial.print(", "); Serial.print("\"Vmax(V)\":"); Serial.print(Vmax, 3); Serial.print(", "); Serial.print("\"Vmin(V)\":"); Serial.print(Vmin, 3); Serial.print(", "); Serial.print("\"Vmed(V)\":"); Serial.print(Vmed, 3); Serial.println("}"); */ /* //saída formatada como CSV Serial.print(millis()); Serial.print(", "); Serial.print(Vrms, 3); Serial.print(", "); Serial.print(Vmax, 3); Serial.print(", "); Serial.print(Vmin, 3); Serial.print(", "); Serial.println(Vmed, 3); */ }
ขั้นตอนที่ 14: ไฟล์
ดาวน์โหลดไฟล์:
ไฟล์ PDF
ฉันไม่