Mục lục:
- Bước 1: Trình diễn
- Bước 2: Tài nguyên được sử dụng
- Bước 3: Sơ đồ khối
- Bước 4: Lược đồ
- Bước 5: LM386 - Ghim
- Bước 6: AmpOp - Vi sai (bộ trừ)
- Bước 7: AmpOp - Quảng cáo biến tần
- Bước 8: Maple Mini - Tiền đúc
- Bước 9: Maple Mini - Ghim - a / D được sử dụng để chụp
- Bước 10: Lắp ráp
- Bước 11: Vẽ biểu đồ với dữ liệu thu được
- Bước 12: Tính giá trị RMS
- Bước 13: Mã nguồn
- Bước 14: Tập tin
2025 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2025-01-13 06:58
Hôm nay, chúng ta sẽ sử dụng STM32 Maple Mini để đọc AC. Trong ví dụ của chúng tôi, chúng tôi sẽ nhận được giá trị RMS của lưới điện. Điều này rất hữu ích cho những ai muốn giám sát mạng lưới điện cho Internet of Things. Sau đó, chúng tôi sẽ tạo một ứng dụng sử dụng sức mạnh tính toán của Maple Mini, áp dụng một mạch điện tử có khả năng cho phép thu tín hiệu 127Vac, cũng như áp dụng phép tính bình phương trung bình (RMS) trên các mẫu.
Bước 1: Trình diễn
Trong hệ thống lắp ráp của chúng tôi ngày hôm nay, chúng tôi có STM32, ngoài mạch tương tự của chúng tôi để tạo đầu vào 110. Để tránh sốc, hãy cách ly điện trở đi vào 110.
Mạch khá nhạy. Tôi đang nhận được với 110, nhưng tôi giảm nó 168 lần bằng cách sử dụng bộ chia điện áp và đặt nó vào bộ khuếch đại hoạt động, có một số chức năng.
Chúng tôi cũng có một số tụ điện tùy chọn để lọc nguồn. Nếu nguồn của bạn có chất lượng tốt, bạn không cần sử dụng chúng.
Đầu vào AD được tính toán thông qua máy hiện sóng, trong đó bạn thấy một hình sin, không phải là 110 (nhưng nó được hình thành tốt). Một điều nữa là điện áp trong mạng điện của chúng ta không phải là 110 (thực tế là 127 vôn). Nhưng khi chúng ta đang sử dụng bộ ổn định, nó sẽ điều chỉnh thành 115V.
Giá trị hiển thị trên màn hình nối tiếp là giá trị được tính bằng RMS, tức là giá trị được xác định bởi Fluke Meter.
Bước 2: Tài nguyên được sử dụng
• Nhảy cầu
• Một Mini Maple
• Protoboard
• Bộ khuếch đại LM386
• Nguồn đối xứng (+ 5V và -5V)
• Một trimpot nhiều vòng 10k (hoặc chiết áp)
• Bốn tụ điện 100nF polyester
• Ba điện trở 10k
• Bốn điện trở 470k
• Một điện trở 5k6
• Một diode zener 1n4728A
Bước 3: Sơ đồ khối
Bước 4: Lược đồ
Đây là mạch tôi phát triển dựa trên các thông số kỹ thuật mà tôi tin là tốt nhất cho phép đo này, nhưng có một số ví dụ khác có thể tìm thấy trên internet.
Bước 5: LM386 - Ghim
LM386 có hai bộ khuếch đại để điều hòa hoặc khuếch đại tín hiệu.
Bước 6: AmpOp - Vi sai (bộ trừ)
Bước 7: AmpOp - Quảng cáo biến tần
Bước 8: Maple Mini - Tiền đúc
Các ghim được đánh dấu trên:
Đỏ >> Dung sai 3V3
Màu xanh lá cây >> Dung sai 5V
Bước 9: Maple Mini - Ghim - a / D được sử dụng để chụp
Tôi nhấn mạnh ở đây rằng chân cắm mà tôi đã sử dụng là D11 (theo danh pháp của STMicroelectronics) là PA0.
Bước 10: Lắp ráp
Đối với mạch của chúng tôi, bạn sẽ cần một nguồn đối xứng, giống như nguồn mà chúng tôi đã tạo cho dự án này. Nếu không, bạn sẽ cần hai nguồn.
Bước 11: Vẽ biểu đồ với dữ liệu thu được
Bước 12: Tính giá trị RMS
Bước 13: Mã nguồn
Mã nguồn - Định nghĩa và hằng số
Lúc đầu, chúng tôi xác định giá trị đọc pin là D11, cũng như các hằng số khác nhau được sử dụng trong các phép tính.
#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; // Valor usado na multilicaçã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 do offset do amplificador = Vcc / 2.0; const float offSet = 1,66; // fator teórico da seekã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 para cada atualização
Mã nguồn - Biến toàn cục
Bây giờ, chúng ta xác định một số biến toàn cục.
float Vrms = 0.0; // armazena o valor rms da tensãofloat Vmax = 0.0; // armazena o valor máximo Detado float Vmin = 10000.0; // armazena o valor mínimo Detado float Vmed = 0.0; // armazena o valor médio entre Vmáx e Vmín
Mã nguồn - Thiết lập ()
Khởi động cổng nối tiếp ở tốc độ 1Mbps. Chúng tôi đã điều chỉnh cổng AD làm đầu vào và đợi 5 giây trước khi bắt đầu thu thập dữ liệu. Thời gian chờ là tùy chọn.
void setup () {Serial.begin (1000000); // inicia a porta serial em 1Mbps pinMode (leituraTensao, INPUT); // ajusta a porta do AD como entrada delay (5000); // aguarda 5s antes de iniciar a coleta. (opcional)}
Mã nguồn - Vòng lặp () - Bắt đầu các biến thu thập dữ liệu
Trong Loop, chúng ta có biến để lặp. Ở đây, chúng tôi cũng lưu trữ các số đọc của AD trong 0.0 và khởi động lại biến VRMS cũng trong 0.0.
void loop () {int i = 0; // variável para iteração float leitura = 0.0; // armazena as leituras do AD Vrms = 0.0; // reinicia a variável Vrms
Mã nguồn - Chụp và thực hiện các tính toán riêng lẻ cho từng mẫu
Ở giai đoạn này, nếu tôi nhỏ hơn mẫu, chúng tôi bắt đầu một chu kỳ lấy mẫu cho đến khi tôi đạt được số lượng mẫu. Chúng tôi chạy analogRead để đọc cổng analog và tính tổng bình phương của các điện áp đọc được. Cuối cùng, chúng tôi tăng trình lặp.
while (i <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); // tính toán một soma dos quadrados das tensões lidas i ++; // incrementa o iterador}
Mã nguồn - Tính toán chung của các mẫu và xác định giá trị tối đa, tối thiểu và trung bình
Chúng tôi áp dụng thực tế nhân để xác định giá trị thực của điện áp. Chúng tôi phát hiện xem giá trị là lớn nhất hay nhỏ nhất và chúng tôi tính giá trị trung bình của giá trị tối đa và tối thiểu hiện tại.
// Aplicando fator de multiplelicação paraminar o valor real das tensões Vrms = (sqrt (Vrms / amostras)) * fatorMultiplicacao; // deta se é um valor é máximo if (Vrms> Vmax) {Vmax = Vrms; } // deta se é um valor mínimo if (Vrms <Vmin) {Vmin = Vrms; } // tính a média dos valores máximo e mínimo atuais Vmed = (Vmax + Vmin) / 2.0;
Mã nguồn - Tùy chọn đầu ra
Chúng tôi có ba tùy chọn để "vẽ" giá trị đầu ra. Chúng tôi đã định dạng đầu ra cho máy vẽ nối tiếp Arduino IDE, như CSV hoặc Jason.
// saída formatada para plotter serial 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 (millis ()); 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); * /}
Bước 14: Tập tin
Tải xuống các tệp:
NS