FEATURE: Finished implementaton of pressure input channels
This commit is contained in:
parent
d8159087d9
commit
68d6346d72
@ -7,6 +7,6 @@
|
||||
|
||||
// Auto generated header file containing the last git revision
|
||||
|
||||
#define GIT_HASH "ff0aed1"
|
||||
#define GIT_HASH "56a7d25"
|
||||
|
||||
#endif //FLOATPUMP_GIT_REVISION_TEMPLATE_H
|
@ -14,6 +14,7 @@
|
||||
#include "Menu_Entry_Type_Time.h"
|
||||
#include "Config_Store.h"
|
||||
#include "Menu_Controller.h"
|
||||
#include "PressureChannel.h"
|
||||
|
||||
#define SLAVE_ADDRESS_LCD 0x4e
|
||||
|
||||
@ -87,12 +88,10 @@ int main(void) {
|
||||
Menu mainmenu("Hauptmenu");
|
||||
Menu_Entry_Type_Checkable entry1bool(false), entry2bool(false);
|
||||
|
||||
bool l_calib = false, h_calib = false;
|
||||
uint16_t lcb = 0, hcb = 4096;
|
||||
uint8_t perc = 50;
|
||||
bool l_calib, h_calib = false;
|
||||
uint8_t cur_perc = 0;
|
||||
|
||||
uint32_t current = 0;
|
||||
uint16_t prescaler = 0;
|
||||
|
||||
entry1bool.linkConfig(&l_calib);
|
||||
entry2bool.linkConfig(&h_calib);
|
||||
@ -122,14 +121,14 @@ int main(void) {
|
||||
HAL_GPIO_WritePin(MPWR0_GPIO_Port, MPWR0_Pin, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(MPWR2_GPIO_Port, MPWR2_Pin, GPIO_PIN_SET);
|
||||
|
||||
uint16_t timed_tp = 0;
|
||||
uint16_t averaging[25];
|
||||
int index_avg = 0;
|
||||
|
||||
floatpump::io::PressureChannel channel(&hadc1, MPWR0_GPIO_Port, MPWR0_Pin);
|
||||
|
||||
|
||||
static int old_pos = 0;
|
||||
while (1) {
|
||||
|
||||
//render menu
|
||||
controller.execute();
|
||||
if (rot_button) {
|
||||
rot_button = false;
|
||||
@ -145,42 +144,27 @@ int main(void) {
|
||||
}
|
||||
HAL_Delay(100);
|
||||
|
||||
timed_tp++;
|
||||
|
||||
//Execute each second
|
||||
if(l_calib)
|
||||
channel.calibrateLow();
|
||||
|
||||
uint32_t measured, avg = 0;
|
||||
if(h_calib)
|
||||
channel.calibrateHigh();
|
||||
|
||||
HAL_ADC_Start(&hadc1);
|
||||
HAL_ADC_PollForConversion(&hadc1, 1);
|
||||
measured = HAL_ADC_GetValue(&hadc1);
|
||||
|
||||
averaging[index_avg % 25] = measured;
|
||||
|
||||
for(int i = 0; i < 25; i++) {
|
||||
avg += averaging[i];
|
||||
}
|
||||
|
||||
current = avg/25;
|
||||
index_avg++;
|
||||
|
||||
//calibrate
|
||||
|
||||
if(l_calib) {
|
||||
l_calib = false;
|
||||
lcb = current - 10;
|
||||
}
|
||||
|
||||
if(h_calib) {
|
||||
h_calib = false;
|
||||
hcb = current + 10;
|
||||
}
|
||||
|
||||
cur_perc = ((current - lcb) *100)/(hcb-lcb);
|
||||
prescaler++;
|
||||
|
||||
if(cur_perc > perc + 5) {
|
||||
if(prescaler % 100 == 0)
|
||||
channel.poll();
|
||||
|
||||
current = channel.getRaw();
|
||||
cur_perc = channel.getPercent();
|
||||
|
||||
if(cur_perc > 50) {
|
||||
HAL_GPIO_WritePin(OCHAN0_GPIO_Port, OCHAN0_Pin, GPIO_PIN_SET);
|
||||
} else if(cur_perc < perc - 5) {
|
||||
} else if(cur_perc < 45) {
|
||||
HAL_GPIO_WritePin(OCHAN0_GPIO_Port, OCHAN0_Pin, GPIO_PIN_RESET);
|
||||
}
|
||||
}
|
||||
|
@ -1,67 +0,0 @@
|
||||
//
|
||||
// Created by robtor on 10.01.23.
|
||||
//
|
||||
|
||||
#ifndef FLOATPUMP_INPUTCHANNEL_H
|
||||
#define FLOATPUMP_INPUTCHANNEL_H
|
||||
|
||||
#include <cstdint>
|
||||
#include "stm32f4xx_hal.h"
|
||||
|
||||
namespace floatpump {
|
||||
namespace io {
|
||||
|
||||
class InputChannel {
|
||||
|
||||
public:
|
||||
InputChannel(ADC_HandleTypeDef *adc, GPIO_TypeDef *gpio, uint16_t port) : m_adc(adc), m_gpio(gpio), m_gpio_port(port) {};
|
||||
|
||||
void poll() {
|
||||
//Enable measuring power
|
||||
HAL_GPIO_WritePin(m_gpio, m_gpio_port, GPIO_PIN_SET);
|
||||
HAL_Delay(m_cooldown);
|
||||
|
||||
uint16_t average = 0;
|
||||
|
||||
for(int i = 0; i < m_avg_size; i++) {
|
||||
HAL_Delay(m_avg_delay);
|
||||
HAL_ADC_Start(m_adc);
|
||||
HAL_ADC_PollForConversion(m_adc, m_avg_delay);
|
||||
average += HAL_ADC_GetValue(m_adc);
|
||||
}
|
||||
|
||||
m_raw = average / m_avg_size;
|
||||
|
||||
m_percent = ((m_raw - m_lowcalib)*100)/(m_highcalib-m_lowcalib);
|
||||
}
|
||||
|
||||
uint16_t getRaw() {
|
||||
return m_raw;
|
||||
}
|
||||
|
||||
int8_t getPercent() {
|
||||
return m_percent;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
const uint16_t m_avg_size = 50;
|
||||
const uint16_t m_avg_delay = 10;
|
||||
const uint16_t m_cooldown = 500;
|
||||
|
||||
uint16_t m_lowcalib = 0;
|
||||
uint16_t m_highcalib = 65535;
|
||||
|
||||
uint16_t m_raw = 0;
|
||||
int8_t m_percent = 0;
|
||||
|
||||
ADC_HandleTypeDef *m_adc;
|
||||
GPIO_TypeDef *m_gpio;
|
||||
uint16_t m_gpio_port;
|
||||
|
||||
};
|
||||
|
||||
} // floatpump
|
||||
} // io
|
||||
|
||||
#endif //FLOATPUMP_INPUTCHANNEL_H
|
50
Middlewares/floatpump/Inc/PressureChannel.h
Normal file
50
Middlewares/floatpump/Inc/PressureChannel.h
Normal file
@ -0,0 +1,50 @@
|
||||
//
|
||||
// Created by robtor on 10.01.23.
|
||||
//
|
||||
|
||||
#ifndef FLOATPUMP_PRESSURECHANNEL_H
|
||||
#define FLOATPUMP_PRESSURECHANNEL_H
|
||||
|
||||
#include <cstdint>
|
||||
#include "stm32f4xx_hal.h"
|
||||
|
||||
namespace floatpump::io {
|
||||
|
||||
class PressureChannel {
|
||||
|
||||
public:
|
||||
PressureChannel(ADC_HandleTypeDef *adc, GPIO_TypeDef *gpio, uint16_t port, const uint16_t avg_size = 50);;
|
||||
|
||||
void poll();
|
||||
|
||||
[[nodiscard]] uint16_t getRaw() const;
|
||||
|
||||
[[nodiscard]] int8_t getPercent() const;
|
||||
|
||||
[[maybe_unused]] void calibrateManualLow(uint16_t low);
|
||||
|
||||
[[maybe_unused]] void calibrateManualHigh(uint16_t high);
|
||||
|
||||
void calibrateLow();
|
||||
|
||||
void calibrateHigh();
|
||||
|
||||
private:
|
||||
const uint16_t m_avg_size = 50;
|
||||
const uint16_t m_avg_delay = 10;
|
||||
const uint16_t m_cooldown = 500;
|
||||
|
||||
uint16_t m_lowcalib = 0;
|
||||
uint16_t m_highcalib = 65535;
|
||||
|
||||
uint16_t m_raw = 0;
|
||||
int8_t m_percent = 0;
|
||||
|
||||
ADC_HandleTypeDef *m_adc;
|
||||
GPIO_TypeDef *m_gpio;
|
||||
uint16_t m_gpio_port;
|
||||
};
|
||||
|
||||
} // io
|
||||
|
||||
#endif //FLOATPUMP_PRESSURECHANNEL_H
|
@ -1,11 +0,0 @@
|
||||
//
|
||||
// Created by robtor on 10.01.23.
|
||||
//
|
||||
|
||||
#include "InputChannel.h"
|
||||
|
||||
namespace floatpump {
|
||||
namespace io {
|
||||
|
||||
} // floatpump
|
||||
} // io
|
61
Middlewares/floatpump/Src/PressureChannel.cpp
Normal file
61
Middlewares/floatpump/Src/PressureChannel.cpp
Normal file
@ -0,0 +1,61 @@
|
||||
//
|
||||
// Created by robtor on 10.01.23.
|
||||
//
|
||||
|
||||
#include "PressureChannel.h"
|
||||
|
||||
namespace floatpump::io {
|
||||
|
||||
void PressureChannel::poll() {
|
||||
//Enable measuring power
|
||||
HAL_GPIO_WritePin(m_gpio, m_gpio_port, GPIO_PIN_SET);
|
||||
HAL_Delay(m_cooldown);
|
||||
|
||||
uint32_t average = 0;
|
||||
|
||||
for (int i = 0; i < m_avg_size; i++) {
|
||||
HAL_Delay(m_avg_delay);
|
||||
HAL_ADC_Start(m_adc);
|
||||
HAL_ADC_PollForConversion(m_adc, m_avg_delay);
|
||||
average += HAL_ADC_GetValue(m_adc);
|
||||
}
|
||||
|
||||
HAL_GPIO_WritePin(m_gpio, m_gpio_port, GPIO_PIN_RESET);
|
||||
|
||||
|
||||
m_raw = average / m_avg_size;
|
||||
|
||||
m_percent = (int8_t) (((m_raw - m_lowcalib) * 100) / (m_highcalib - m_lowcalib));
|
||||
|
||||
}
|
||||
|
||||
PressureChannel::PressureChannel(ADC_HandleTypeDef *adc, GPIO_TypeDef *gpio, uint16_t port,
|
||||
const uint16_t avg_size) : m_adc(adc), m_gpio(gpio), m_gpio_port(port),
|
||||
m_avg_size(avg_size) {}
|
||||
|
||||
uint16_t PressureChannel::getRaw() const {
|
||||
return m_raw;
|
||||
}
|
||||
|
||||
int8_t PressureChannel::getPercent() const {
|
||||
return m_percent;
|
||||
}
|
||||
|
||||
void PressureChannel::calibrateManualLow(uint16_t low) {
|
||||
m_lowcalib = low;
|
||||
}
|
||||
|
||||
void PressureChannel::calibrateManualHigh(uint16_t high) {
|
||||
m_highcalib = high;
|
||||
}
|
||||
|
||||
void PressureChannel::calibrateLow() {
|
||||
poll();
|
||||
m_lowcalib = m_raw;
|
||||
}
|
||||
|
||||
void PressureChannel::calibrateHigh() {
|
||||
poll();
|
||||
m_highcalib = m_raw;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user