来自不同 AD7606 通道的混合电压读数

Posted

技术标签:

【中文标题】来自不同 AD7606 通道的混合电压读数【英文标题】:Mixed voltage reading from different AD7606 channels 【发布时间】:2021-11-10 04:20:26 【问题描述】:

请帮忙!我正在使用 FSMC 将 STM32F407 MCU 与 AD7606 连接以采样电压值。 MCU 将在 1024 次转换后使用 USB HS 端口将采样值发送到 PC。但是当我检查来自 PC 的值时,我发现来自通道 0 的读数偶尔会包含来自其他通道的数据。例如,如果将通道 0 连接到 5v,将通道 8 连接到 3.3v,将其他通道连接到地。那么来自通道 0 的打印值将包含 5v、0v、3.3v。基本设置如下:

    TIM10 生成一个 200KHZ PWM 信号,作为 AD7606 的 CONVST 信号。 然后 7606 会发出一个 BUSY 信号,我将其用作外部中断源。 在中断处理程序中,将发出 DMA 请求以读取 8 个 16 位数据 从 FSMC 地址空间到内存空间。如果 1024 将停止 TIM10 PWM 已完成转换。 在 DMA XFER_CPLT 回调中,如果已完成 1024 次转换,则转换后的 数据将由 USB HS 端口发送,TIM10 PWM 将再次启用。

一些代码块:

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    
        if(GPIO_Pin == GPIO_PIN_7)
        
            // DMA data from FSMC to memory
            HAL_DMA_Start_IT(&hdma_memtomem_dma2_stream0, 0x6C000000, (uint32_t)(adc_data + adc_data_idx) , 8);
    
            adc_data_idx += 8;
    
            if (adc_data_idx >= ADC_DATA_SIZE)
                HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
        

    
    void dma_done(DMA_HandleTypeDef *_hdma)
    
        int i;
        int ret;
        
        // adc_data[adc_data_idx] would always contain data from 
        // channel 1, led1 wouldn't light if every thing is fine.
        if (adc_data[adc_data_idx] < 0x7f00 )
                HAL_GPIO_WritePin(led1_GPIO_Port, led1_Pin, GPIO_PIN_SET);
    
        if (adc_data_idx >= ADC_DATA_SIZE)
        
            if(hUsbDeviceHS.dev_state == USBD_STATE_CONFIGURED)
            
                // if I don't call CDC_Transmit_HS, everything is fine.
                ret = CDC_Transmit_HS((uint8_t *)(adc_data), ADC_DATA_SIZE * 2 );
                if (ret != USBD_OK)
                
                    HAL_GPIO_WritePin(led1_GPIO_Port, led2_Pin, GPIO_PIN_SET);
                
            
        
            adc_data_idx = 0;
        
            HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
        
         
     
似乎单个 USB 事务需要超过 5us(一个转换时间),所以我停止了 PWM 信号以停止转换... 如果我只发送数据缓冲区的后半部分,则没有数据混合。这很奇怪。

【问题讨论】:

我很难找出问题所在。是转换太慢还是混合电压有问题?您能否先获取所有数据,然后在单独的线程中转换,而不是即时转换。 @cup 如果我不能说清楚,请原谅我。这个问题困扰了我3天,我觉得我傻了...问题是,一旦我开始使用USB将数据传输到PC,通道数据就会混合......如果我不打电话dma_done中的CDC_Transmit_HS,数据没问题.... 【参考方案1】:

根据你的描述,我认为处理是正确的,问题出在CDC_Transmit_HS();我在CDC_Transmit_FS()上遇到了问题,原代码不能传输超过64字节的数据,需要修改一些代码,否则会出现一些错误。您检查接收到的数据数量是否正确?

参考: I can't receive more than 64 bytes on custom USB CDC class based STM32 device

我不确定您的ADC_DATA_SIZE 大小;如果大于 64 字节,也许你可以修改为小于 64 字节,然后再试一次,检查数据是否正确。我不确定它是否受到这个问题的影响,但我认为你可以尝试一下。

另一方面,可能还需要将 AD7606 未使用的 ADC IN 引脚接地以避免通道之间的干扰。

或者您可以尝试其他通信方式(I2C、SPI、UART...等)来发送数据。

如果其他通讯方式没有问题,很有可能是CDC_Transmit_HS()有问题。如果其他传输方式有问题,可能需要检查ADC转换时间和传输时间是否冲突。

【讨论】:

感谢您的回答!事实证明,我的问题的根本原因是 USB 无法足够快地将 ADC 数据传输到 PC。我将 ADC 的采样率降低到 100KHZ,问题就消失了。再次感谢您的宝贵时间!

以上是关于来自不同 AD7606 通道的混合电压读数的主要内容,如果未能解决你的问题,请参考以下文章

创龙AD+全志T3 ad_display 开发案例

创龙AD+全志T3 ad_display 开发案例

omapl138+FPGA AD7606数据采集测试

STM32H7并行读取AD7606数据以及片内AD值不准解决办法

STM32H7并行读取AD7606数据以及片内AD值不准解决办法

STM32G070的AD调试