sync
This commit is contained in:
parent
a4aeaa5f91
commit
d36f3b85b4
|
|
@ -2,24 +2,13 @@
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.20.0)
|
cmake_minimum_required(VERSION 3.20.0)
|
||||||
|
|
||||||
|
# This line should ideally be after project() and find_package(Zephyr)
|
||||||
|
# target_include_directories(app PRIVATE ${ZEPHYR_BASE}/include/zephyr/drivers) # <-- WRONG POSITION
|
||||||
|
|
||||||
list(APPEND BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
|
list(APPEND BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||||
project(valve_node)
|
project(valve_node)
|
||||||
|
|
||||||
target_sources(app PRIVATE src/main.c)
|
target_include_directories(app PRIVATE ${ZEPHYR_BASE}/include/zephyr/drivers)
|
||||||
target_sources(app PRIVATE lib/canbus.c)
|
target_sources(app PRIVATE src/main2.c)
|
||||||
|
|
||||||
# source files for modbus waterlevel sensor
|
|
||||||
zephyr_library_sources_ifdef(CONFIG_HAS_MODBUS_WATERLEVEL_SENSOR
|
|
||||||
lib/waterlevel_sensor.c
|
|
||||||
)
|
|
||||||
|
|
||||||
#source files for valve
|
|
||||||
zephyr_library_sources_ifdef(CONFIG_HAS_VALVE
|
|
||||||
lib/valve.c
|
|
||||||
)
|
|
||||||
|
|
||||||
zephyr_include_directories(
|
|
||||||
lib
|
|
||||||
)
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.20.0)
|
||||||
|
|
||||||
|
list(APPEND BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||||
|
project(valve_node)
|
||||||
|
|
||||||
|
target_sources(app PRIVATE src/main.c)
|
||||||
|
target_sources(app PRIVATE lib/canbus.c)
|
||||||
|
|
||||||
|
# source files for modbus waterlevel sensor
|
||||||
|
zephyr_library_sources_ifdef(CONFIG_HAS_MODBUS_WATERLEVEL_SENSOR
|
||||||
|
lib/waterlevel_sensor.c
|
||||||
|
)
|
||||||
|
|
||||||
|
#source files for valve
|
||||||
|
zephyr_library_sources_ifdef(CONFIG_HAS_VALVE
|
||||||
|
lib/valve.c
|
||||||
|
)
|
||||||
|
|
||||||
|
zephyr_include_directories(
|
||||||
|
lib
|
||||||
|
)
|
||||||
|
|
@ -5,13 +5,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
#include <st/f1/stm32f1.dtsi>
|
||||||
#include <st/f1/stm32f103Xb.dtsi>
|
#include <st/f1/stm32f103Xb.dtsi>
|
||||||
#include <st/f1/stm32f103r(8-b)tx-pinctrl.dtsi>
|
#include <st/f1/stm32f103r(8-b)tx-pinctrl.dtsi>
|
||||||
#include <zephyr/dt-bindings/input/input-event-codes.h>
|
#include <zephyr/dt-bindings/input/input-event-codes.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Iten engineering Valve Node";
|
model = "Iten engineering Valve Node";
|
||||||
compatible = "iten,valve-node", "st,stm32f103rb";
|
compatible = "st,stm32f103rb";
|
||||||
|
|
||||||
can_loopback0: can_loopback0 {
|
can_loopback0: can_loopback0 {
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
@ -24,7 +25,6 @@
|
||||||
zephyr,sram = &sram0;
|
zephyr,sram = &sram0;
|
||||||
zephyr,flash = &flash0;
|
zephyr,flash = &flash0;
|
||||||
zephyr,canbus = &can1;
|
zephyr,canbus = &can1;
|
||||||
//zephyr,canbus = &can_loopback0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
leds: leds {
|
leds: leds {
|
||||||
|
|
@ -71,19 +71,10 @@
|
||||||
sw0 = &user_button;
|
sw0 = &user_button;
|
||||||
watchdog0 = &iwdg;
|
watchdog0 = &iwdg;
|
||||||
die-temp0 = &die_temp;
|
die-temp0 = &die_temp;
|
||||||
|
adc-motor-current = &motor_current_channel;
|
||||||
|
adc-vref = &vref_channel;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
zephyr,user {
|
|
||||||
motoropen: motor_open {
|
|
||||||
gpios = <&gpiob 13 0>;
|
|
||||||
label = "Motor Open";
|
|
||||||
};
|
|
||||||
fake: fake {
|
|
||||||
gpios = <&gpiob 11 GPIO_PULL_UP>;
|
|
||||||
label = "CAN RX pullup";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
&clk_lsi {
|
&clk_lsi {
|
||||||
|
|
@ -107,7 +98,7 @@
|
||||||
ahb-prescaler = <1>;
|
ahb-prescaler = <1>;
|
||||||
apb1-prescaler = <2>;
|
apb1-prescaler = <2>;
|
||||||
apb2-prescaler = <1>;
|
apb2-prescaler = <1>;
|
||||||
adc-prescaler = <2>;
|
adc-prescaler = <6>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&usart1 {
|
&usart1 {
|
||||||
|
|
@ -125,7 +116,6 @@
|
||||||
modbus0 {
|
modbus0 {
|
||||||
compatible = "zephyr,modbus-serial";
|
compatible = "zephyr,modbus-serial";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
//de-gpios = <&gpioa 15 GPIO_ACTIVE_LOW>;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -153,9 +143,28 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&adc1 {
|
&adc1 {
|
||||||
pinctrl-0 = <&adc1_in0_pa0>;
|
pinctrl-0 = <&adc_pb1_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
motor_current_channel: channel@9 {
|
||||||
|
reg = <0x9>;
|
||||||
|
zephyr,gain = "ADC_GAIN_1";
|
||||||
|
zephyr,reference = "ADC_REF_VDD_1";
|
||||||
|
zephyr,acquisition-time = <49159>;
|
||||||
|
zephyr,resolution = <12>;
|
||||||
|
};
|
||||||
|
|
||||||
|
vref_channel: channel@11 { /* 17 dezimal = 11 hex */
|
||||||
|
reg = <0x11>;
|
||||||
|
zephyr,gain = "ADC_GAIN_1";
|
||||||
|
zephyr,reference = "ADC_REF_VDD_1";
|
||||||
|
zephyr,acquisition-time = <49159>;
|
||||||
|
zephyr,resolution = <12>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&die_temp {
|
&die_temp {
|
||||||
|
|
@ -172,7 +181,6 @@
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
||||||
/* Set 2KB of storage at the end of 128KB flash */
|
|
||||||
storage_partition: partition@1f800 {
|
storage_partition: partition@1f800 {
|
||||||
label = "storage";
|
label = "storage";
|
||||||
reg = <0x0001f800 DT_SIZE_K(2)>;
|
reg = <0x0001f800 DT_SIZE_K(2)>;
|
||||||
|
|
@ -184,9 +192,15 @@
|
||||||
pinctrl-0 = <&can_rx_pa11 &can_tx_pa12>;
|
pinctrl-0 = <&can_rx_pa11 &can_tx_pa12>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
status= "okay";
|
status= "okay";
|
||||||
bus-speed = <125000>;
|
bitrate = <125000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&exti {
|
&exti {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&pinctrl {
|
||||||
|
adc_pb1_pins: adc_pb1_pins {
|
||||||
|
pinmux = <STM32F1_PINMUX('B', 1, ANALOG, NO_REMAP)>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -15,3 +15,6 @@ CONFIG_SHELL=y
|
||||||
CONFIG_CAN_SHELL=y
|
CONFIG_CAN_SHELL=y
|
||||||
CONFIG_GPIO_SHELL=y
|
CONFIG_GPIO_SHELL=y
|
||||||
CONFIG_REBOOT=y
|
CONFIG_REBOOT=y
|
||||||
|
|
||||||
|
CONFIG_ADC=y
|
||||||
|
CONFIG_ADC_STM32=y
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
#include <zephyr/kernel.h>
|
||||||
|
#include <zephyr/drivers/adc.h>
|
||||||
|
#include <zephyr/logging/log.h>
|
||||||
|
#include <zephyr/device.h>
|
||||||
|
#include <zephyr/devicetree.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
LOG_MODULE_REGISTER(main2, LOG_LEVEL_DBG);
|
||||||
|
|
||||||
|
#define MOTOR_ADC_NODE DT_ALIAS(adc_motor_current)
|
||||||
|
#define VREF_ADC_NODE DT_ALIAS(adc_vref)
|
||||||
|
|
||||||
|
static const struct device * const adc_dev = DEVICE_DT_GET(DT_PARENT(MOTOR_ADC_NODE));
|
||||||
|
static const uint8_t motor_channel_id = DT_REG_ADDR(MOTOR_ADC_NODE);
|
||||||
|
static const uint8_t vref_channel_id = DT_REG_ADDR(VREF_ADC_NODE);
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
int16_t adc_raw_value;
|
||||||
|
|
||||||
|
LOG_INF("Starting ADC test with direct register setup...");
|
||||||
|
|
||||||
|
if (!device_is_ready(adc_dev)) {
|
||||||
|
LOG_ERR("ADC device is not ready");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INF("Manually setting up ADC registers...");
|
||||||
|
|
||||||
|
uint32_t adc_base = DT_REG_ADDR(DT_NODELABEL(adc1));
|
||||||
|
|
||||||
|
volatile uint32_t *ADC_CR2 = (uint32_t *)(adc_base + 0x08);
|
||||||
|
volatile uint32_t *ADC_SMPR1 = (uint32_t *)(adc_base + 0x0C);
|
||||||
|
volatile uint32_t *ADC_SMPR2 = (uint32_t *)(adc_base + 0x10);
|
||||||
|
|
||||||
|
// Schritt 1: Internen VREFINT-Kanal einschalten
|
||||||
|
const uint32_t ADC_CR2_TSVREFE_BIT = 23;
|
||||||
|
*ADC_CR2 |= (1 << ADC_CR2_TSVREFE_BIT);
|
||||||
|
LOG_INF("VREFINT channel enabled via CR2 register.");
|
||||||
|
|
||||||
|
// Schritt 2: Lange Abtastzeiten für Stabilität setzen
|
||||||
|
*ADC_SMPR2 |= (0b111 << (3 * 9));
|
||||||
|
*ADC_SMPR1 |= (0b111 << (3 * (17 - 10)));
|
||||||
|
LOG_INF("Acquisition times set directly in SMPR registers.");
|
||||||
|
|
||||||
|
|
||||||
|
k_busy_wait(10);
|
||||||
|
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
int32_t motor_raw = 0;
|
||||||
|
int32_t vref_raw = 0;
|
||||||
|
|
||||||
|
struct adc_sequence sequence = {
|
||||||
|
.buffer = &adc_raw_value,
|
||||||
|
.buffer_size = sizeof(adc_raw_value),
|
||||||
|
.resolution = 12,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Motor-Kanal lesen
|
||||||
|
sequence.channels = BIT(motor_channel_id);
|
||||||
|
if (adc_read(adc_dev, &sequence) == 0) {
|
||||||
|
motor_raw = adc_raw_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// VREF-Kanal lesen
|
||||||
|
sequence.channels = BIT(vref_channel_id);
|
||||||
|
if (adc_read(adc_dev, &sequence) == 0) {
|
||||||
|
vref_raw = adc_raw_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// VDD-Berechnung mit dem generischen, aber für Sie gut funktionierenden 1200mV-Wert
|
||||||
|
int32_t vdd_mv = (vref_raw > 0) ? (1200 * 4095 / vref_raw) : 0;
|
||||||
|
int32_t motor_mv = 0;
|
||||||
|
|
||||||
|
if (motor_raw > 0 && vdd_mv > 0) {
|
||||||
|
motor_mv = motor_raw;
|
||||||
|
err = adc_raw_to_millivolts(vdd_mv, ADC_GAIN_1, 12, &motor_mv);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INF("Motor Raw: %4d, Motor mV: %4d | VDD: %4d mV", motor_raw, motor_mv, vdd_mv);
|
||||||
|
k_sleep(K_MSEC(2000));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue