91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【瑞薩RA × Zephyr評(píng)測(cè)】ADC、DAC和PWM

楓雪天 ? 來源:楓雪天 ? 2026-01-10 10:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文章旨在評(píng)估使用 Zephyr RTOS 在 Renesas FPB-RA6E2 開發(fā)板上實(shí)現(xiàn) ADC模數(shù)轉(zhuǎn)換器)、DAC數(shù)模轉(zhuǎn)換器)和 PWM(脈寬調(diào)制)功能的應(yīng)用。評(píng)估內(nèi)容包括設(shè)備樹配置、驅(qū)動(dòng)初始化流程、主程序邏輯的詳細(xì)解析,以及實(shí)驗(yàn)現(xiàn)象與數(shù)據(jù)分析。


1. 硬件連接與引腳定義

本實(shí)驗(yàn)涉及 ADC、DAC 和 PWM 的硬件資源,以下是關(guān)鍵引腳及其功能:

功能物理引腳 (Pin)信號(hào)定義接線說明
ADC 輸入P013Analog In (AN011)連接至 DAC 輸出或外部信號(hào)源
DAC 輸出P014Analog Out (DA0)輸出模擬電壓
PWM 輸出P408PWM Signal使用 GPT1 定時(shí)器通道 1

2. 軟件環(huán)境配置

2.1 Device Tree Overlay (app.overlay)

設(shè)備樹用于定義外設(shè)的物理引腳綁定和初始狀態(tài)。以下是關(guān)鍵配置:

ADC 配置

&adc0 {
    status = "okay";
    pinctrl-0 = < &adc0_default >;
    pinctrl-names = "default";

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

};

#### DAC 配置

&dac0 {
    status = "okay";
    pinctrl-0 = < &dac0_default >;
    pinctrl-names = "default";
};

&pinctrl {
    dac0_default: dac0_default {
        group1 {
            psels = < RA_PSEL(RA_PSEL_DAC, 0, 14) >;
            renesas,analog-enable;
        };
    };
};
};
};

};

#### PWM 配置

&pwm1 {
    status = "okay";
};

pwmleds {
    compatible = "pwm-leds";
    pwm_led_p408: pwm_led_p408 {
        pwms = < &pwm1 1 PWM_MSEC(1) PWM_POLARITY_NORMAL >;
    };
};
};
};

};

### 2.2 Kconfig 配置 (prj.conf)

確保啟用了 ADC、DAC 和 PWM 驅(qū)動(dòng)支持:

CONFIG_ADC=y
CONFIG_DAC=y
CONFIG_PWM=y
CONFIG_LOG=y

3. 代碼邏輯分析

3.1 核心流程

ADC 流程

/*
 * Copyright (c) 2020 Libre Solar Technologies GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include < inttypes.h >
#include < stddef.h >
#include < stdint.h >

#include < zephyr/device.h >
#include < zephyr/devicetree.h >
#include < zephyr/drivers/adc.h >
#include < zephyr/kernel.h >
#include < zephyr/sys/printk.h >
#include < zephyr/sys/util.h >

#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)
};

int main(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])) {
			printk("ADC controller device %s not readyn", adc_channels[i].dev- >name);
			return 0;
		}

		err = adc_channel_setup_dt(&adc_channels[i]);
		if (err < 0) {
			printk("Could not setup channel #%d (%d)n", i, err);
			return 0;
		}
	}

	while (1) {
		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;
			}
			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" mVn", val_mv);
			}
		}

		k_msleep(1000);
	}
	return 0;
}
  1. 初始化 ADC 驅(qū)動(dòng)并配置通道。
  2. 調(diào)用 adc_read 函數(shù)讀取模擬輸入值。
  3. 將讀取的數(shù)字值轉(zhuǎn)換為實(shí)際電壓(基于參考電壓和分辨率)。

DAC 流程

/*
 * Copyright (c) 2020 Libre Solar Technologies GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include < zephyr/kernel.h >
#include < zephyr/sys/printk.h >
#include < zephyr/drivers/dac.h >

#define ZEPHYR_USER_NODE DT_PATH(zephyr_user)

#if (DT_NODE_HAS_PROP(ZEPHYR_USER_NODE, dac) && 
	DT_NODE_HAS_PROP(ZEPHYR_USER_NODE, dac_channel_id) && 
	DT_NODE_HAS_PROP(ZEPHYR_USER_NODE, dac_resolution))
#define DAC_NODE DT_PHANDLE(ZEPHYR_USER_NODE, dac)
#define DAC_CHANNEL_ID DT_PROP(ZEPHYR_USER_NODE, dac_channel_id)
#define DAC_RESOLUTION DT_PROP(ZEPHYR_USER_NODE, dac_resolution)
#else
#error "Unsupported board: see README and check /zephyr,user node"
#define DAC_NODE DT_INVALID_NODE
#define DAC_CHANNEL_ID 0
#define DAC_RESOLUTION 0
#endif

static const struct device *const dac_dev = DEVICE_DT_GET(DAC_NODE);

static const struct dac_channel_cfg dac_ch_cfg = {
	.channel_id  = DAC_CHANNEL_ID,
	.resolution  = DAC_RESOLUTION,
#if defined(CONFIG_DAC_BUFFER_NOT_SUPPORT)
	.buffered = false,
#else
	.buffered = true,
#endif /* CONFIG_DAC_BUFFER_NOT_SUPPORT */
};

int main(void)
{
	if (!device_is_ready(dac_dev)) {
		printk("DAC device %s is not readyn", dac_dev- >name);
		return 0;
	}

	int ret = dac_channel_setup(dac_dev, &dac_ch_cfg);

	if (ret != 0) {
		printk("Setting up of DAC channel failed with code %dn", ret);
		return 0;
	}

	printk("Generating sawtooth signal at DAC channel %d.n",
		DAC_CHANNEL_ID);
	while (1) {
		/* Number of valid DAC values, e.g. 4096 for 12-bit DAC */
		const int dac_values = 1U < < DAC_RESOLUTION;

		/*
		 * 1 msec sleep leads to about 4 sec signal period for 12-bit
		 * DACs. For DACs with lower resolution, sleep time needs to
		 * be increased.
		 * Make sure to sleep at least 1 msec even for future 16-bit
		 * DACs (lowering signal frequency).
		 */
		const int sleep_time = 4096 / dac_values > 0 ?
			4096 / dac_values : 1;

		for (int i = 0; i < dac_values; i++) {
			ret = dac_write_value(dac_dev, DAC_CHANNEL_ID, i);
			if (ret != 0) {
				printk("dac_write_value() failed with code %dn", ret);
				return 0;
			}
			k_sleep(K_MSEC(sleep_time));
		}
	}
	return 0;
}
  1. 初始化 DAC 驅(qū)動(dòng)并設(shè)置通道分辨率。
  2. 調(diào)用 dac_write_value 函數(shù)輸出模擬電壓。
  3. 通過循環(huán)生成鋸齒波或三角波。

PWM 流程

/*
 * Copyright (c) 2016 Intel Corporation
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include < zephyr/kernel.h >
#include < zephyr/sys/printk.h >
#include < zephyr/device.h >
#include < zephyr/drivers/pwm.h >
 
/* 
 * 獲取設(shè)備樹中的 pwm-led0 別名
 * 注意:根據(jù)之前的 Overlay 配置,這對(duì)應(yīng) P408 引腳
 */
static const struct pwm_dt_spec pwm_dev = PWM_DT_SPEC_GET(DT_ALIAS(pwm_led0));
 
 
#define PERIOD PWM_MSEC(1)
 
/* 每次循環(huán)增加的占空比百分?jǐn)?shù) */
#define STEP   5
 
/* 每次速度變化的間隔時(shí)間 (毫秒) */
#define SLEEP_MS   500
 
int main(void)
{
	int ret;
	uint8_t duty_cycle = 0;   // 當(dāng)前占空比 (0-100)
	uint32_t pulse_width = 0; // 實(shí)際脈寬時(shí)間
 
	if (!pwm_is_ready_dt(&pwm_dev)) {
		printk("Error: PWM device %s is not readyn",
		       pwm_dev.dev- >name);
		return 0;
	}
 
	printk("Starting pwm control on channel %d...n", pwm_dev.channel);
 
	ret = pwm_set_dt(&pwm_dev, PERIOD, 0);
	if (ret) {
		printk("Error: PWM device does not support period %lun", PERIOD);
		return 0;
	}
 
	while (1) {
		/* 計(jì)算脈寬: (周期 * 百分比) / 100 */
		pulse_width = (uint32_t)((uint64_t)PERIOD * duty_cycle / 100U);
 
		/* 設(shè)置 PWM: 周期固定,改變脈寬 */
		ret = pwm_set_dt(&pwm_dev, PERIOD, pulse_width);
		if (ret) {
			printk("Error %d: failed to set pulse widthn", ret);
			return 0;
		}
 
		/* 增加速度 */
		duty_cycle += STEP;
 
		/* 如果超過 100%,重置為 0 */
		if (duty_cycle > 100) {
			duty_cycle = 0; 
            printk(" > > Resetting cycle <
  1. 初始化 PWM 驅(qū)動(dòng)并設(shè)置周期。
  2. 調(diào)用 pwm_set_dt 函數(shù)調(diào)整占空比。
  3. 通過循環(huán)實(shí)現(xiàn)占空比的動(dòng)態(tài)變化。

3.2 關(guān)鍵 API 使用

以下是代碼中使用的關(guān)鍵 API:

ADC

int adc_read(const struct device *dev, const struct adc_sequence *sequence);
  • dev: ADC 設(shè)備句柄。
  • sequence: 包含通道、緩沖區(qū)和采樣時(shí)間的配置結(jié)構(gòu)體。

DAC

int dac_write_value(const struct device *dev, uint8_t channel, uint32_t value);
  • dev: DAC 設(shè)備句柄。
  • channel: DAC 通道 ID。
  • value: 輸出的數(shù)字值。

PWM

int pwm_set_dt(const struct pwm_dt_spec *spec, uint32_t period, uint32_t pulse);
  • spec: PWM 設(shè)備樹綁定結(jié)構(gòu)體。
  • period: PWM 周期(納秒)。
  • pulse: PWM 脈寬(納秒)。

4. 實(shí)驗(yàn)現(xiàn)象與數(shù)據(jù)分析

4.1 ADC 數(shù)據(jù)采集

終端應(yīng)顯示如下數(shù)據(jù)流:

ADC reading[0]:
* adc@40170000, channel 0: 0 = 0 mV

4.2 DAC 輸出波形

  • 初始狀態(tài) : DAC 輸出 0V。
  • 運(yùn)行時(shí) : 生成鋸齒波或三角波,頻率由延時(shí)控制。
  • 視覺效果 : 使用示波器觀測(cè) P014 引腳,應(yīng)看到穩(wěn)定的波形。
    DAC鋸齒波.png

4.3 PWM 占空比變化

  • 初始狀態(tài) : PWM 輸出低電平。
  • 運(yùn)行時(shí) : 占空比從 0% 到 100% 循環(huán)變化。
  • 視覺效果 : 使用 LED 或示波器觀測(cè) P408 引腳,亮度或波形應(yīng)隨占空比變化。

5. 測(cè)評(píng)總結(jié)

本程序成功演示了 Renesas RA6E2 在 Zephyr RTOS 下的 ADC、DAC 和 PWM 外設(shè)控制。通過閉環(huán)測(cè)試驗(yàn)證了數(shù)模轉(zhuǎn)換的準(zhǔn)確性,并展示了嵌入式系統(tǒng)中“數(shù)字-模擬-數(shù)字”的完整轉(zhuǎn)換過程。代碼結(jié)構(gòu)清晰,適配了最新的驅(qū)動(dòng) API,適用于初學(xué)者學(xué)習(xí)和開發(fā)者快速驗(yàn)證硬件功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45492

    瀏覽量

    670137
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    7511

    瀏覽量

    555875
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    26

    文章

    6288

    瀏覽量

    117994
  • Zephyr
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    6579
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何搭建RA VS code開發(fā)環(huán)境

    在上一篇文章“當(dāng)RA MCU遇見Zephyr,打通嵌入式開發(fā)任督二脈!”中,我們介紹了Zephyr極具前景的發(fā)展趨勢(shì)以及開發(fā)板對(duì)
    的頭像 發(fā)表于 11-05 14:41 ?4445次閱讀
    如何搭建<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RA</b> VS code開發(fā)環(huán)境

    RA6M3 HMI Board評(píng)測(cè)挑戰(zhàn)】-RA6M3上的CAN實(shí)踐

    RA6M3 HMI Board 評(píng)測(cè)大挑戰(zhàn)】-RA6M3上的CAN實(shí)踐
    的頭像 發(fā)表于 10-17 14:55 ?3644次閱讀
    【<b class='flag-5'>RA</b>6M3 HMI Board<b class='flag-5'>評(píng)測(cè)</b>挑戰(zhàn)】-<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RA</b>6M3上的CAN實(shí)踐

    當(dāng)RA MCU遇見Zephyr系列(3)——在Vs code中配置Zephyr集成開發(fā)環(huán)境

    RA生態(tài)工作室關(guān)注我們上一篇文章介紹了如何在VScode中使用官方插件為RA芯片創(chuàng)建項(xiàng)目與項(xiàng)目調(diào)試,相信大家對(duì)RA在VScode中的開發(fā)
    的頭像 發(fā)表于 01-01 10:04 ?4785次閱讀
    當(dāng)<b class='flag-5'>RA</b> MCU遇見<b class='flag-5'>Zephyr</b>系列(3)——在Vs  code中配置<b class='flag-5'>Zephyr</b>集成開發(fā)環(huán)境

    RA4E2開發(fā)板評(píng)測(cè)ADC+DAC

    收到了發(fā)過來的RA4E2開發(fā)板,之前也測(cè)試過相關(guān)的ARM單片機(jī),
    發(fā)表于 09-02 13:35

    RA6E2】ADCDAC 電壓輸入輸出

    ); 代碼中 dac 的值為 0 ~ 4095,對(duì)應(yīng) 0 ~ 3.3v 電壓 【ADC 電壓輸入】 RA6E2 支持 12 位
    發(fā)表于 11-10 01:29

    RA6E2地奇星開發(fā)板試用】DAC 輸出指定電壓、ADC 電壓檢測(cè)

    ); 代碼中 dac 的值為 0 ~ 4095,對(duì)應(yīng) 0 ~ 3.3v 電壓 【ADC 電壓輸入】 RA6E2 支持 12 位
    發(fā)表于 12-19 18:30

    FPB-RA6E2試用】【原創(chuàng)】【RA × Zephyr開發(fā)板評(píng)測(cè)】+入門級(jí)任務(wù)測(cè)試1

    很榮幸獲得了RA × ZephyrFPB-RA
    發(fā)表于 12-24 23:52

    FPB-RA6E2試用】【RA × Zephyr開發(fā)板評(píng)測(cè)】Linux環(huán)境配置和初步試用

    1. 前言 很榮幸獲得了RA × ZephyrFPB-
    發(fā)表于 12-29 12:55

    FPB-RA6E2試用】基礎(chǔ)功能使用2

    的基礎(chǔ)功能模塊。 PWM 呼吸燈 前言 硬件:Renesas FPB-RA6E2 開發(fā)板 系統(tǒng) zephyr 4.2.0 目的:測(cè)評(píng)zephyr對(duì)
    發(fā)表于 12-30 17:08

    FPB-RA6E2試用】【原創(chuàng)】基于【FPB-RA6E2】Windows 下Zephyr RTOS自定義項(xiàng)目開發(fā)全流程(創(chuàng)建-編譯-燒錄-串口調(diào)試)

    【原創(chuàng)】基于【FPB-RA6E2】Windows 下Zephyr RTOS自定義項(xiàng)目開發(fā)全流程(創(chuàng)建 · 編譯 · 燒錄 · 串口調(diào)試) 《整體全流程演示》。 使用的硬件:
    發(fā)表于 01-01 15:35

    FPB-RA6E2試用】【RA × Zephyr開發(fā)板評(píng)測(cè)ADC、DAC、SPI、I2C 測(cè)試

    1. 前言 在上一篇評(píng)測(cè)中,我們完成了開發(fā)環(huán)境搭建和基礎(chǔ) GPIO 控制。作為一款高性能 MCU,RA6E2 的通信接口(SPI/I2C)和模擬外設(shè)(ADC/DAC)才是其核心競(jìng)爭(zhēng)力的
    發(fā)表于 01-12 00:01

    RA × Zephyr開發(fā)板評(píng)測(cè)】基于PWM的電機(jī)轉(zhuǎn)速控制

    項(xiàng)目使用的FPB-RAE62作為控制板,主要功能如下: ADC采集控制器數(shù)據(jù)來控制PWM波形的占空比 電機(jī)驅(qū)動(dòng)板來控制的電機(jī)的轉(zhuǎn)速 PWM
    發(fā)表于 01-16 01:19

    FPB-RA6E2試用】【FPB-RA6E2】 DAC-ADC 回環(huán)測(cè)試:基于 Zephyr RTOS 的模擬信號(hào)通路驗(yàn)證

    Zephyr ADC / DAC API 調(diào)試設(shè)備樹 / pinctrl 校準(zhǔn) ADC / DAC 偏差 硬件 Bring-up 階段測(cè)試
    發(fā)表于 01-16 15:22

    FPB-RA6E2試用】【RA × Zephyr開發(fā)板評(píng)測(cè)】基于PWM的電機(jī)轉(zhuǎn)速控制

    項(xiàng)目使用的FPB-RAE62作為控制板,主要功能如下: ADC采集控制器數(shù)據(jù)來控制PWM波形的占空比 電機(jī)驅(qū)動(dòng)板來控制的電機(jī)的轉(zhuǎn)速 PWM
    發(fā)表于 01-17 16:18

    RA × Zephyr評(píng)測(cè)】SSD1306顯示MPU6050加速度計(jì)讀數(shù)

    本文介紹了在RA6E2單片機(jī)上基于Zephyr RTOS操作SPI與I2C總線的實(shí)驗(yàn)
    的頭像 發(fā)表于 01-10 10:24 ?726次閱讀
    【<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RA</b> × <b class='flag-5'>Zephyr</b><b class='flag-5'>評(píng)測(cè)</b>】SSD1306顯示MPU6050加速度計(jì)讀數(shù)