Dear support,
I am using this board: https://www.nologo.tech/en/product/otherboard/NRF52840.html#%E5%BC%95%E8%84%9A%E5%9B%BE. I am trying to use any analog input to eventually read the voltage of my 72V battery pack. Just to get started i want to send some values via BLE. I have tried different configurations in the dts, still getting err = 234. adc_init() seems to work as expected. This is not a nordic devboard so debugging is mainly done using custom values sent to nrf connect app. I did try internal reference and also vdd as refence. I use FOTA at all times for convenience. I use nrf connec sdk in visual studio code.
I have this device tree and overlay:
// Copyright (c) 2024 Nordic Semiconductor ASA
// SPDX-License-Identifier: Apache-2.0
/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>
/ {
model = "ProMicro nRF";
compatible = "promicro,promicro-nrf";
chosen {
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,code-partition = &slot0_partition;
};
zephyr,user {
io-channels = <&adc 0>;
io-channel-names = "MAIN_VOLTAGE";
};
aliases {
redled = &red;
};
gate_1: gate-1 {
compatible = "nordic,gpio-pins";
gpios = <&gpio0 20 (1 << 9)>;
status = "okay";
};
gate_2: gate-2 {
compatible = "nordic,gpio-pins";
gpios = <&gpio0 22 (1 << 9)>;
status = "okay";
};
sw_1: sw-1 {
compatible = "nordic,gpio-pins";
gpios = <&gpio1 4 0>;
status = "okay";
};
sw_2: sw-2 {
compatible = "nordic,gpio-pins";
gpios = <&gpio1 6 0>;
status = "okay";
};
pir_1: pir-1 {
compatible = "nordic,gpio-pins";
gpios = <&gpio0 9 GPIO_PULL_DOWN>;
status = "okay";
};
sw_pwr_1: sw-pwr-1 {
compatible = "nordic,gpio-pins";
gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
status = "okay";
};
button_1: button-1 {
compatible = "nordic,gpio-pins";
gpios = <&gpio0 17 GPIO_PULL_UP>;
status = "okay";
};
sw_mp3: sw-mp3 {
compatible = "nordic,gpio-pins";
gpios = <&gpio0 2 GPIO_ACTIVE_HIGH>;
status = "okay";
};
sw_light: sw-light {
compatible = "nordic,gpio-pins";
gpios = <&gpio0 29 (1 << 9)>;
status = "okay";
};
leds {
compatible = "gpio-leds";
red: led_0 {
gpios = <&gpio0 15 (GPIO_ACTIVE_LOW)>;
label = "Red LED";
};
};
};
&flash0 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x0 0xc000>;
};
slot0_partition: partition@c000 {
label = "image-0";
reg = <0xc000 0x72000>;
};
slot1_partition: partition@7e000 {
label = "image-1";
reg = <0x7e000 0x72000>;
};
scratch_partition: partition@f0000 {
label = "image-scratch";
reg = <0xf0000 0xa000>;
};
storage_partition: partition@fa000 {
label = "storage";
reg = <0xfa000 0x6000>;
};
};
};
&gpio0 {
status = "okay";
};
&gpio1 {
status = "okay";
};
&gpiote {
status = "okay";
};
&adc {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
channel@0 {
reg = <0>;
zephyr,gain = "ADC_GAIN_1_6";
zephyr,reference = "ADC_REF_INTERNAL";
zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 20)>;
zephyr,input-positive = <NRF_SAADC_AIN0>; /* P0.24 */
zephyr,resolution = <10>;
};
};
/ {
gate_1: gate-1 {
status = "disabled";
};
gate_2: gate-2 {
status = "disabled";
};
sw_1: sw-1 {
status = "disabled";
};
sw_2: sw-2 {
status = "disabled";
};
pir_1: pir-1 {
status = "disabled";
};
sw_pwr_1: sw-pwr-1 {
status = "disabled";
};
button_1: button-1 {
status = "disabled";
};
sw_mp3: sw-mp3 {
status = "disabled";
};
sw_light: sw-light {
status = "disabled";
};
leds {
compatible = "gpio-leds";
red: led_0 {
gpios = <&gpio0 15 (GPIO_ACTIVE_LOW)>;
label = "Red LED";
};
};
};
&adc {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
channel@0 {
reg = <0>;
zephyr,gain = "ADC_GAIN_1";
zephyr,reference = "ADC_REF_VDD_1";
zephyr,acquisition-time = <ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 50)>;
zephyr,input-positive = <NRF_SAADC_AIN2>;
zephyr,resolution = <10>;
};
};
This is my application:
#include "application.h"
#include "../bluetooth/bluetooth.h"
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/settings/settings.h>
#include <bluetooth/services/lbs.h>
#include <hal/nrf_power.h>
#include <zephyr/drivers/adc.h>
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(redled), gpios);
#define ADC_DEVICE_NAME DT_NODE_FULL_NAME(DT_NODELABEL(adc))
#define ADC_SAMPLE_INTERVAL 20 //unit:ms
#define BATTERY_VOLTAGE(sample) (sample * 6 * 600 / 1024)
static const struct adc_channel_cfg ch0_cfg_dt =
ADC_CHANNEL_CFG_DT(DT_CHILD(DT_NODELABEL(adc), channel_0));
const struct device *adc_dev;
static int16_t adc_buffer[1];
static uint8_t error_debug = 100;
static struct adc_sequence sequence = {
.options = NULL,
.buffer = adc_buffer,
.buffer_size = sizeof(adc_buffer),
.resolution = 10,
.oversampling = 0,
.calibrate = false,
};
static int init_adc(void)
{
int err;
adc_dev = device_get_binding(ADC_DEVICE_NAME);
error_debug = 101;
if (!adc_dev) {
error_debug = 110;
bt_lbs_send_voltage(11);
return -EIO;
}
err = adc_channel_setup(adc_dev, &ch0_cfg_dt);
error_debug = 102;
if (err) {
error_debug = err;
bt_lbs_send_voltage(13);
return err;
}
error_debug = 103;
return 0;
}
int adc_sample(void)
{
int err;
err = adc_read(adc_dev, &sequence);
if (err) {
bt_lbs_send_voltage(3);
k_sleep(K_MSEC(1000));
bt_lbs_send_voltage(err);
return err;
}
bt_lbs_send_voltage(10);
k_sleep(K_MSEC(1000));
bt_lbs_send_voltage(adc_buffer[0]);
return 0;
}
void init_pins()
{
gpio_pin_configure_dt(&led, GPIO_OUTPUT_INACTIVE);
}
void run_application()
{
static int32_t number = 0;
init_pins();
bluetooth_init();
bluetooth_start_advertising();
gpio_pin_set_dt(&led, 0);
k_sleep(K_MSEC(1000));
init_adc();
k_sleep(K_MSEC(5000));
gpio_pin_set_dt(&led, 1);
for (;;)
{
number++;
k_sleep(K_MSEC(2000)); // 1000ms
adc_sample();
k_sleep(K_MSEC(2000)); // 1000ms
gpio_pin_set_dt(&led, 0);
k_sleep(K_MSEC(1000)); // 1000ms
gpio_pin_set_dt(&led, 1);
bt_lbs_send_voltage(error_debug);
k_sleep(K_MSEC(1000)); // 1000ms
}
}