[Решено] Автобаланс моста Уитстона

Тед
Чт, 03 января 2019 г., 17:21
Уитстоун -мост
С Новым годом всех.
Я собираюсь сделать программу, которая позволяет автоматически балансировать мост Уитстоун, нажав кнопку.
Схема.
1.8 м заменяется вторым фоторерезисторным и светодиодом, какая яркости регулируется шириной импульса ШИМ, нажав кнопки. Я хочу заменить эти две кнопки на 1 кнопку = Автоза баланса. Функция должна найти минимальное значение напряжения, применяемого к PA7, которое поступает от усилителя LM324.

Я искал аналогичные приложения функций Arduino Min/Max без удачи.
Мне нужна помощь.

Изображение
#include "EmonLib.h" #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); EnergyMonitor emon1; float cur, acur[50], sumc; volatile int i = 128; //initializing a integer for incrementing and decrementing duty ratio. void setup() { pinMode(PB6, INPUT_PULLDOWN);// sets the pin0 as output pinMode(PB5, INPUT_PULLDOWN);// sets the pin1 as output // pinMode(PA3, PWM); //pinMode(PA2, PWM); pinMode(PA7, INPUT); // I2 analogWrite(PA3, i); lcd.begin(16, 2); // set up the LCD’s number of columns and rows Serial.begin(9600); emon1.current(PA7, 2500); } // Serial.begin(9600); //Serial.println(i); void loop() { emon1.calcVI(20, 2000); emon1.serialprint(); float Irms = emon1.Irms; if (digitalRead(PB6) == HIGH) { if (i < 255) { i++;//if pin PB3 is pressed and the duty ratio value is less than 255 analogWrite(PA3, i); // analogWrite values from 0 to 255 delay(30); } } if (digitalRead(PB5) == HIGH) { if (i > 0) { i--;// if pin PB5 is pressed and the duty ratio value is greater than 0 analogWrite(PA3, i); // analogWrite values from 0 to 255 delay(30); } } Serial.println(i); lcd.setCursor(0, 1); lcd.print("U="); lcd.print(i); // triming b lcd.setCursor(0, 0); lcd.print("H="); //A, PA7 lcd.print(Irms ); }

Fredbox
Чт, 03 января 2019 г., 19:57
Я бы рассматривал это как к двум независимым разделителям напряжения. Поскольку импеданс высокий, вам нужно будет буферировать каждый разделитель с помощью Opamp (вход к +, подключен к выходу). Вывод этих двух опалов может подавать аналоговые выводы. Оттуда это вопрос чтения аналоговых входов и изменения сигнала ШИМ, чтобы соответствовать аналоговым значениям. Для STM32 питайте цепь из 3.3 вольт.

Тед
Чт, 03 января 2019 22:22
С аппаратным обеспечением у меня нет проблем, я ищу примеры, как используется минимальный/максимум функции Arduino.
https: // www.Ардуино.cc/reference/en/lan ... /математика/мин/

Mrburnette
Пт, 04 января 2019 г., 3:51
[Тед - Чт, 03 января 2019 г. 22:22] - С аппаратным обеспечением у меня нет проблем, я ищу примеры, как используется минимальный/максимум функции Arduino.
https: // www.Ардуино.cc/reference/en/lan ... /математика/мин/
http: // docs.Leaflabs.com/docs.Leaflabs.com/index.HTML

...под Математика

мин ()
max ()
ABS ()
contrain ()
map ()
pow ()
SQRT ()

Ахулл
Пт, 04 января 2019 12:04
.. Еще одна вещь, которую следует иметь в виду, ШИМ - ШИМ, так что он включен или выключен, что касается вашей схемы, вам может потребоваться сгладить ШИМ, чтобы дать вам более линейное напряжение, хотя LDR может не слишком быстро реагировать На мигающий свет он отреагирует и будет довольно быстро с низкой сопротивлением к высокой синхронизации с ШИМ.

Это может показаться глупым вопросом, но какова предполагаемая функция этого дизайна? Не могли бы вы использовать что -то вроде усилителя LoadCell (предназначенное для взвешивания вещей, используя нагрузки, которые по сути являются мостами -пшеничными камнями), чтобы выполнить работу для вас?

Дэнниф
Пт, 04 января 2019 14:32
Автобалансировать от моста Уитстоун, нажав кнопку. Похоже, ты хочешь вручную автоматически балансировать мост - первый в истории человечества, я думаю, :)

Много способов сделать это, и самым простым будет аналоговое решение, даже если оно реализовано через MCU (например, используя встроенный компаратор).

Но прежде чем что -то сделать, вам нужно решить, что именно вы пытаетесь сделать.

Тед
Пт, 04 января 2019 г. 16:37
@mrburnette
Ссылка не имеет математического раздела.

Тед
Пт, 04 января 2019 г. 16:47
Вот концепция.
Ширина ширины импульса ШИМ позволит записать минимальное значение напряжения, MIM () найдет его, чем PWM будет генерировать обозначенную ширину импульса.

Тед
Пн, 07 января 2019 1:53
Первый шаг почти сделан.
В первой программе яркость светодиода меняется при нажатии кнопки = 0K, int led = PB15; ///////////////////// // int button = PB7; // continuous const int button= PB12;// ////////////////////// int buttonState =0; int brightness = 0; int brightup = 1; void setup() { pinMode(led, OUTPUT); //pinMode(button, INPUT); pinMode(button, INPUT_PULLDOWN); } void loop() { analogWrite(led, brightness); buttonState = digitalRead(button); if ( buttonState == HIGH ) { brightness = brightness + brightup; } //if ( brightness == 255 ) if ( brightness == 100 ) { brightness = 0; } delay(30); }

Айдахоулкер
Пн, 07 января 2019 2:05
Что это значит:
if (ledPin, HIGH) //PC13 { }

Тед
Пн, 07 января 2019 2:50 утра
Это означает, делай все, что находится в кронштейнах, когда логический уровень на ПК13 высок

Айдахоулкер
Вторник 08 января 2019 г. 13:19
Итак, вы указываете это if (ledPin, HIGH) //PC13 { }

Моду
Вторник 08 января 2019 г., 16:11
Любое ненулевое значение интерпретируется как истинное для большинства компиляторов.

Fredbox
Ср. 09 января 2019 г., 4:30 утра
[Тед - Пн, 07 января 2019 2:50] - Это означает, делай все, что находится в кронштейнах, когда логический уровень на ПК13 высок
Нет, это не делает этого. Это означает, что если высокий правда, делайте все, что находится в скобках.
В языках программирования C и C ++ оператор запятой (представленным токеном) - это двоичный оператор, который оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип). Видеть https: // en.Википедия.org/wiki/comma_operator#условие

Стивестронг
Ср. 09 января 2019 г. 8:19
Спасибо, сегодня я узнал что -то новое 8-)

Дэнниф
Ср. 09 января 2019 11:11
if (ledPin == HIGH) //PC13

Тед
Ср. 09 января 2019 22:29
Я делаю еще одну программу и работаю, как мне нужно, первый шаг сделан. //int led = PB15; const int led = PB15; const int button= PB12;// // constants won't change. They're used here to set pin numbers: //const int button2Pin = PB9; int button2Pin = PB9; // the number of the pushbutton pin int ledPin = PC13; // the number of the LED pin // variables will change: int button2State = 0; int buttonState =0; int brightness = 0; int brightup = 1; void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(button2Pin, INPUT_PULLDOWN); pinMode(led, OUTPUT); //pinMode(button, INPUT); pinMode(button, INPUT_PULLDOWN); } void loop() { // read the state of the pushbutton value: button2State = digitalRead(button2Pin); // check if the pushbutton is pressed. If it is, the buttonState is HIGH: if (button2State == HIGH) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } analogWrite(led, brightness); buttonState = digitalRead(button); if ( buttonState == HIGH ) { brightness = brightness + brightup; } //if ( brightness == 255 ) if ( brightness == 100 ) { brightness = 0; } delay(30); }

Стивестронг
Чт 10 января 2019 г., 7:49
У вас есть две переменные «Вольт», глобальный (int) и локальный (float, in main ()).

Тед
Чт 10 января 2019 г. 14:20
Я не думаю, что проблема есть.

Чтобы прояснить, это программа вольтметра, когда светодиод включается в if(volt <= 1200 && volt >= 1000)

Стивестронг
Чт 10 января 2019 г. 16:39
Если вы не слушаете нас, то вы можете делать то, что хотите, но не ожидайте никакой поддержки. Я закончил здесь. Удачи.

Тед
Чт 10 января 2019 г. 18:01
Я думаю, что это противоположный путь, почему я должен вносить изменения в программу, которая работает правильно = последний код, проблема была дополнительно. Спасибо за ваши пожелания, результаты ниже.
Часть 2 сделана.
Просто соберите обе программы, и автоматический баланс будет работать. int currentValue; // global variables are retained on each iteration of loop() int previousValue; int analogPin = PB0; const int buttonPin = PB12; // int buttonState = 0; int volt; int i; //int volt, avolt[50]; int LED = PB14; //int volt = 0; #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); void setup() { pinMode(buttonPin, INPUT_PULLDOWN); pinMode(LED_BUILTIN, OUTPUT); //pinMode(PA7, INPUT_ANALOG); pinMode(PB0, INPUT); pinMode(PB14, OUTPUT); lcd.begin(16, 2); } void loop() { buttonState = digitalRead(buttonPin); digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(100); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(200); float volt = analogRead(PB0); //volt = (volt * 3.3) / 4095.0; volt = (volt * 3.3); lcd.setCursor(0, 0); lcd.print(volt); delay(1000); previousValue = currentValue; // store what was read last time currentValue = analogRead(analogPin); // get a new reading //if (previousValue != currentValue) if (buttonState == HIGH) if (previousValue > currentValue) { // compare them // do something, they are different digitalWrite(PB14, HIGH); LED = 1; } else // do something else, they are the same { digitalWrite(PB14, LOW); LED = 0; } }

Монитор открытой энергии

[Решено] VCO