baonng 发表于 2022-6-15 17:08

使用403A的ADC怎么会影响被采信号?

最近在学习403A的单片机,在使用403A的ADC采样时,发现一个奇怪的问题,就是启动ADC后,似乎ADC对被采信号有影响。
用示波器看,未启动ADC时,被测信号是一个1.3V的直流信号,当ADC启动后,电压变为1.6v了,关键还出现了毛刺。
实在不知道怎么回事,还请知道的能告知。直流信号是通过电位器分压得到的。

403A初始化,系统时钟为192MHz
static void adc_config(void)
{
adc_base_config_type adc_base_struct;
        dma_init_type dma_init_struct;
crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
crm_adc_clock_div_set(CRM_ADC_DIV_8);
       
        dma_reset(DMA1_CHANNEL1);
dma_default_para_init(&dma_init_struct);
dma_init_struct.buffer_size = 1;
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_base_addr = (uint32_t)&ADC1_Value;
dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
dma_init_struct.memory_inc_enable = FALSE;
dma_init_struct.peripheral_base_addr = (uint32_t)&(ADC1->odt)+1;        // 利用DMA实现8位精度时+1
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.loop_mode_enable = TRUE;
dma_init(DMA1_CHANNEL1, &dma_init_struct);

dma_channel_enable(DMA1_CHANNEL1, TRUE);
//dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE);

/* select combine mode */
adc_combine_mode_select(ADC_INDEPENDENT_MODE);
adc_base_default_para_init(&adc_base_struct);
adc_base_struct.sequence_mode = FALSE;
adc_base_struct.repeat_mode = TRUE;
adc_base_struct.data_align = ADC_LEFT_ALIGNMENT;//ADC_RIGHT_ALIGNMENT;        // 利用DMA实现8位精度时左对齐
adc_base_struct.ordinary_channel_length = 1;
adc_base_config(ADC1, &adc_base_struct);
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 1, ADC_SAMPLETIME_239_5);
adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
adc_dma_mode_enable(ADC1, TRUE);

adc_enable(ADC1, TRUE);
adc_calibration_init(ADC1);
while(adc_calibration_init_status_get(ADC1));
adc_calibration_start(ADC1);
while(adc_calibration_status_get(ADC1));
        adc_ordinary_software_trigger_enable(ADC1, TRUE);
}



baonng 发表于 2022-6-15 17:09

我感觉这个貌似似乎与ADC的启动采样时间有关系。

gouguoccc 发表于 2022-6-15 18:17

这个是开启ADC时,内部采样保持电容充电导致的。

xch 发表于 2022-6-16 09:37

说明MCU 在采集,你应该开心才对。但是采集周期不够长。

baonng 发表于 2022-6-16 10:14

xch 发表于 2022-6-16 09:37
说明MCU 在采集,你应该开心才对。但是采集周期不够长。

ADC_SAMPLETIME_239_5,这个已经是最大值了啊

baonng 发表于 2022-6-16 10:15

gouguoccc 发表于 2022-6-15 18:17
这个是开启ADC时,内部采样保持电容充电导致的。

有何办法消除吗?

xch 发表于 2022-6-16 11:12

baonng 发表于 2022-6-16 10:14
ADC_SAMPLETIME_239_5,这个已经是最大值了啊


没看出来。 理论上采样时间差不多是10uS。 似乎仅1us。

xch 发表于 2022-6-16 11:17

如果采样周期足够,跌落波形应该是瞬间跌落,然后缓慢恢复到信号电平。

而出示的波形是瞬间跌落,还未对采样电容充满电就立即切断采样电子开关,比下跌更快速度跳回输入信号电平。

xch 发表于 2022-6-16 11:22

雅特利的ADC 可以先设置好需要转换通道,然后才校准吗?

一般ADC 是先校准,然后才设置需要转换的通道。

baonng 发表于 2022-6-16 11:26

xch 发表于 2022-6-16 11:12
没看出来。 理论上采样时间差不多是10uS。 似乎仅1us。

APB2的时钟为96MHz,8分频的话,ADC的时钟就是12MHz,采样周期239.5的话,一个周期就是20us了,从示波器看,两个毛刺间的时间为21us,差不多。

xch 发表于 2022-6-16 11:41

baonng 发表于 2022-6-16 11:26
APB2的时钟为96MHz,8分频的话,ADC的时钟就是12MHz,采样周期239.5的话,一个周期就是20us了,从示波器 ...

ADC 时钟不是APB2时钟。APB2 是ADC 寄存器访问接口总线时钟。
adc使用 PCLK2 作为它转换操作时钟。

baonng 发表于 2022-6-16 13:17

xch 发表于 2022-6-16 11:41
ADC 时钟不是APB2时钟。APB2 是ADC 寄存器访问接口总线时钟。
adc使用 PCLK2 作为它转换操作时钟。
...

是啊,我意思ADC时钟来自APB2。

林堪堪 发表于 2022-6-16 19:21

你电位器用的多大阻值的啊?太大的话可能会有影响。

baonng 发表于 2022-6-17 09:54

本帖最后由 baonng 于 2022-6-17 09:57 编辑

林堪堪 发表于 2022-6-16 19:21
你电位器用的多大阻值的啊?太大的话可能会有影响。
当时手中只有个20K的电位器,所以就用的20K电位器进行分压。看你发的表,我的AD时钟应该是12MHz,所以TS 239.5应该足够了。难道需要给AD引脚增加一个电容?

ArterySW 发表于 2022-6-17 11:22

这个是ADC采样时对内部电容充放电引起的,其原理示意图如下

通常ADC部分设计时,为保障数据的准确性,主要要考虑阻抗匹配等内容,建议可以去这篇文档看看,https://www.arterytek.com/download/APNOTE/AN0074_ADC_Improve_ZH_V2.0.0.pdf
页: [1]
查看完整版本: 使用403A的ADC怎么会影响被采信号?