ADC

设备树文件

/ {
	zephyr,user {
		io-channels = <&adc1 6>;
	};
}

&adc1 {
	status = "okay";
	
	pinctrl-0 = <&adc1_in6_pa6>;
	pinctrl-names = "default";

	st,adc-prescaler = <2>;

	#address-cells = <1>;
	#size-cells = <0>;

	channels@6 {
		reg = <0>;
		zephyr,gain = "ADC_GAIN_1";
		zephyr,reference = "ADC_REF_INTERNAL";
		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
		zephyr,resolution = <12>;
	};
};

配置文件

CONFIG_ADC=y

代码调用部分

#include <zephyr/drivers/adc.h>
#include <zephyr/kernel.h>

static const struct adc_dt_spec channel =
    ADC_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user), 0);

void user_adc_entry() {
  int ret;
  int16_t buf;
  int32_t val_mv;

  if (!adc_is_ready_dt(&channel)) return;

  ret = adc_channel_setup_dt(&channel);
  if (ret < 0) return;

  struct adc_sequence sequence = {
      .buffer = &buf,
      .buffer_size = sizeof(buf),
  };

  ret = adc_sequence_init_dt(&channel, &sequence);
  if (ret < 0) return;

  while (1) {
    adc_read_dt(&channel, &sequence);
    val_mv = buf;

    adc_raw_to_millivolts_dt(&channel, &val_mv);

    printk("ADC Raw val: %d; Voltage: %d mV.\n", buf, val_mv);

    k_sleep(K_SECONDS(1));
  }
}

K_THREAD_DEFINE(tid_adc, 1024, user_adc_entry, NULL, NULL, NULL, 7, 0, 0);

Last modified: 2026-05-24