【已解决】关于ADC采样频率

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
走走停停
Posts: 98

您好,芯片平台bk7231n 老版Tuya os 2.3.3
请问下如何更改或者设置ADC 的采样频率,是否是这个函数tuya_adc_control int tuya_adc_control (tuya_adc_t *adc, uint8_t cmd, void *arg)
或者有无相关说明

chaser
Posts: 77

Re: 【求助】关于ADC采样频率

bk7231n 平台 sdk2.3.3 版本,使用涂鸦封装的 ADC 接口,是没法设置 ADC 采样频率的。 如果当前读取adc的速率太慢,可以考虑直接调用原厂接口采样。
具体参考下面demo

Code: Select all

int bk7031n_saradc_read(int channel)
{
DD_HANDLE handle;
saradc_desc_t desc;
UINT16 buffer[32];
UINT32 index;
UINT32 param;

os_memset((void *)&desc, 0x00, sizeof(saradc_desc_t));
desc.channel = channel;
desc.data_buff_size = sizeof(buffer) / sizeof(buffer[0]);
desc.mode = (ADC_CONFIG_MODE_CONTINUE << 0)
|(ADC_CONFIG_MODE_4CLK_DELAY << 2);
desc.has_data = 0;
desc.current_read_data_cnt = 0;
desc.current_sample_data_cnt = 0;
desc.pre_div = 0x08;
desc.samp_rate = 0x20;
desc.pData = buffer;

handle = ddev_open(SARADC_DEV_NAME, &param, (UINT32)&desc);
if (DD_HANDLE_UNVALID == handle)
{
os_printf("ddev_open(%s) failed\n", SARADC_DEV_NAME);
return -1;
}

while (!desc.all_done)
{
rtos_delay_milliseconds(2);
}

param = 0;
for (index = 0; index < sizeof(buffer) / sizeof(buffer[0]); index++)
{
param += buffer[index];
}

ddev_close(handle);
saradc_ensure_close();

return param / index;
}
走走停停
Posts: 98

Re: 【求助】关于ADC采样频率

chaser 2022年 Nov 23日 14:17

bk7231n 平台 sdk2.3.3 版本,使用涂鸦封装的 ADC 接口,是没法设置 ADC 采样频率的。 如果当前读取adc的速率太慢,可以考虑直接调用原厂接口采样。
具体参考下面demo

Code: Select all

int bk7031n_saradc_read(int channel)
{
DD_HANDLE handle;
saradc_desc_t desc;
UINT16 buffer[32];
UINT32 index;
UINT32 param;

os_memset((void *)&desc, 0x00, sizeof(saradc_desc_t));
desc.channel = channel;
desc.data_buff_size = sizeof(buffer) / sizeof(buffer[0]);
desc.mode = (ADC_CONFIG_MODE_CONTINUE << 0)
|(ADC_CONFIG_MODE_4CLK_DELAY << 2);
desc.has_data = 0;
desc.current_read_data_cnt = 0;
desc.current_sample_data_cnt = 0;
desc.pre_div = 0x08;
desc.samp_rate = 0x20;
desc.pData = buffer;

handle = ddev_open(SARADC_DEV_NAME, &param, (UINT32)&desc);
if (DD_HANDLE_UNVALID == handle)
{
os_printf("ddev_open(%s) failed\n", SARADC_DEV_NAME);
return -1;
}

while (!desc.all_done)
{
rtos_delay_milliseconds(2);
}

param = 0;
for (index = 0; index < sizeof(buffer) / sizeof(buffer[0]); index++)
{
param += buffer[index];
}

ddev_close(handle);
saradc_ensure_close();

return param / index;
}

您好,我们正在使用 BK7232n Nano 开发板进行开发,我们注意到 ADC 在未连接时会在 1700 和 2300 之间波动,这会在我们的测量中引入误差。这可能是因为开发板的 PCB 布局?

chaser
Posts: 77

Re: 【求助】关于ADC采样频率

在 adc 引脚浮空时候, 采集的电压值是不稳定的。 这个值不作为参考。建议直接接上外部电路(外部输入电压),去验证adc功能。

走走停停
Posts: 98

Re: 【求助】关于ADC采样频率

chaser 2022年 Nov 25日 14:08

在 adc 引脚浮空时候, 采集的电压值是不稳定的。 这个值不作为参考。建议直接接上外部电路(外部输入电压),去验证adc功能。

您好,能分享“saradc_pub.c”的代码吗?我们正在尝试设置 DMA / 环形缓冲区 ADC 用法

chaser
Posts: 77

Re: 【求助】关于ADC采样频率

没有 saradc_pub.c 文件, 关于adc底层源码就是文件 saradc.c

走走停停
Posts: 98

Re: 【求助】关于ADC采样频率

chaser 2022年 Nov 29日 20:29

没有 saradc_pub.c 文件, 关于adc底层源码就是文件 saradc.c

好的 谢谢

走走停停
Posts: 98

Re: 【求助】关于ADC采样频率

chaser 2022年 Nov 29日 20:29

没有 saradc_pub.c 文件, 关于adc底层源码就是文件 saradc.c

您好,我们直接将 ADC 与 audio_adc.c 一起使用,我们的目标是使用 DMA 不断填充环形缓冲区。工作原理:CFG_GENERAL_DMA 设置为 true。结果 = audio_adc_open((uint32_t)(&test_aud_cfg)); ----成功打开ADC通道 result = audio_adc_read(&audio_adc_buff, CFG_RX_DMA_BUF_SIZE, 0); ------ 从环形缓冲区中获取值到 audio_adc_buff 中。问题是 DMA 推入环形缓冲区的值不是来自 ADC,而且我无法找到一种方法将其配置为连接到 CBU 模块引脚 5 上的 ADC 通道
麻烦再帮忙看下

走走停停
Posts: 98

Re: 【求助】关于ADC采样频率

走走停停 2022年 Dec 2日 17:19
chaser 2022年 Nov 29日 20:29

没有 saradc_pub.c 文件, 关于adc底层源码就是文件 saradc.c

您好,我们直接将 ADC 与 audio_adc.c 一起使用,我们的目标是使用 DMA 不断填充环形缓冲区。工作原理:CFG_GENERAL_DMA 设置为 true。结果 = audio_adc_open((uint32_t)(&test_aud_cfg)); ----成功打开ADC通道 result = audio_adc_read(&audio_adc_buff, CFG_RX_DMA_BUF_SIZE, 0); ------ 从环形缓冲区中获取值到 audio_adc_buff 中。问题是 DMA 推入环形缓冲区的值不是来自 ADC,而且我无法找到一种方法将其配置为连接到 CBU 模块引脚 5 上的 ADC 通道
麻烦再帮忙看下

您好,可以麻烦帮忙看下吗 比较急

chaser
Posts: 77

Re: 【求助】关于ADC采样频率

bk7231n 平台 ADC 功能是不能接 DMA 的。 所以只能自己搬数据,算数据。 adc 采用连续采集,一次性可以采集数据255个。 只能中断后取出数据,再次取采样。 8分频下,采样一个数据大概 25us左右。 注意:bk7231n 是一个adc,多个通道。每次采集完adc需要close掉,以便其他通道使用。

Post Reply