Hello.
"zephyr/samples/drivers/adc/adc_dt" example sample added an additional adcpin.
When reading the sensor value connected to AIN0, the value of AIN1 is also changing.
How can I solve this?
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE( sta, CONFIG_LOG_DEFAULT_LEVEL );
#include <zephyr/kernel.h>
#include <errno.h>
#include <stdio.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/adc.h>
#include <zephyr/drivers/gpio.h>
#include "ADC.h"
#include "deviceInformation.h"
//! Variable to identify the TCP Client thread
static struct k_thread ADCThread;
//! Stack size for the TCP_CLIENT thread
#define ADC_STACK_SIZE 2*1024
//! ADC thread priority level
#define ADC_PRIORITY 7
//! ADC stack definition
K_THREAD_STACK_DEFINE(ADC_STACK, ADC_STACK_SIZE);
//! Variable to identify the ADC thread
static struct k_thread ADCThread;
#define LEDS_NODE DT_PATH(leds)
#define GPIO_SPEC_AND_COMMA(button_or_led) GPIO_DT_SPEC_GET(button_or_led, gpios),
#if !DT_NODE_EXISTS(DT_PATH(zephyr_user)) || \
!DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels)
#error "No suitable devicetree overlay specified"
#endif
#define DT_SPEC_AND_COMMA(node_id, prop, idx) \
ADC_DT_SPEC_GET_BY_IDX(node_id, idx),
/* Data of ADC io-channels specified in devicetree. */
static const struct adc_dt_spec adc_channels[] = {
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels,
DT_SPEC_AND_COMMA)
};
uint16_t cnt = 0;
// static const struct gpio_dt_spec sensor_en = GPIO_DT_SPEC_GET(DT_PATH(zephyr_user), sensor_en_gpios);
static const struct gpio_dt_spec My_gpios[] = {
GPIO_DT_SPEC_GET(DT_PATH(zephyr_user), bat_en_gpios),
GPIO_DT_SPEC_GET(DT_PATH(zephyr_user), dt1_gpios),
GPIO_DT_SPEC_GET(DT_PATH(zephyr_user), dt2_gpios)
};
static const struct gpio_dt_spec leds[] = {
#if DT_NODE_EXISTS(LEDS_NODE)
DT_FOREACH_CHILD(LEDS_NODE, GPIO_SPEC_AND_COMMA)
#endif
};
void ADC( void )
{
int err;
uint32_t count = 0;
uint16_t buf;
struct adc_sequence sequence = {
.buffer = &buf,
/* buffer size in bytes, not number of samples */
.buffer_size = sizeof(buf),
};
/* Configure channels individually prior to sampling. */
for (size_t i = 0U; i < ARRAY_SIZE(adc_channels); i++) {
if (!adc_is_ready_dt(&adc_channels[i])) {
LOG_INF("ADC controller device %s not ready\n", adc_channels[i].dev->name);
return 0;
}
err = adc_channel_setup_dt(&adc_channels[i]);
if (err < 0) {
LOG_INF("Could not setup channel #%d (%d)\n", i, err);
return 0;
}
}
int ret;
LOG_INF( "ADC Test");
for (size_t i = 0; i < ARRAY_SIZE(leds); i++) {
err = gpio_pin_configure_dt(&leds[i], GPIO_OUTPUT);
if (err) {
LOG_ERR("Cannot configure LED gpio");
return err;
}
}
if (!gpio_is_ready_dt(&My_gpios)) {
return 0;
}
gpio_pin_configure_dt(&My_gpios[0], GPIO_OUTPUT);
gpio_pin_configure_dt(&My_gpios[1], GPIO_OUTPUT);
gpio_pin_configure_dt(&My_gpios[2], GPIO_OUTPUT);
gpio_pin_set_dt(&My_gpios[0], 1); //BAT_EN
gpio_pin_set_dt(&My_gpios[1], 0);
gpio_pin_set_dt(&My_gpios[2], 1);
while(1) {
// LOG_INF( "CNT : %d", cnt);
// cnt++;
printk("ADC reading[%u]:\n", count++);
for (size_t i = 0U; i < ARRAY_SIZE(adc_channels); i++) {
int32_t val_mv;
printk("- %s, channel %d: ",
adc_channels[i].dev->name,
adc_channels[i].channel_id);
(void)adc_sequence_init_dt(&adc_channels[i], &sequence);
err = adc_read_dt(&adc_channels[i], &sequence);
if (err < 0) {
printk("Could not read (%d)\n", err);
continue;
}
/*
* If using differential mode, the 16 bit value
* in the ADC sample buffer should be a signed 2's
* complement value.
*/
if (adc_channels[i].channel_cfg.differential) {
val_mv = (int32_t)((int16_t)buf);
} else {
val_mv = (int32_t)buf;
}
if(val_mv < (int32_t)0 || val_mv > (int32_t)16384) val_mv = (int32_t)0;
printk("%"PRId32, val_mv);
err = adc_raw_to_millivolts_dt(&adc_channels[i],
&val_mv);
/* conversion to mV may not be supported, skip if not */
if (err < 0) {
printk(" (value in mV not available)\n");
} else {
printk(" = %"PRId32" mV\n", val_mv);
}
}
k_msleep(500);
}
}
/*! Task_ADC_Init initializes the task ADC
*
* @brief ADC initialization
*/
void Task_ADC_Init( void ){
k_thread_create (
&ADCThread,
ADC_STACK,
ADC_STACK_SIZE,
(k_thread_entry_t)ADC,
NULL,
NULL,
NULL,
ADC_PRIORITY,
0,
K_NO_WAIT);
k_thread_name_set(&ADCThread, "ADC");
k_thread_start(&ADCThread);
};
