GD32与STM32的ADC差距?

[复制链接]
19243|40
手机看帖
扫描二维码
随时随地手机跟帖
zhxi|  楼主 | 2013-8-27 21:47 | 显示全部楼层 |阅读模式
ADC, hz, RS, AC
不知道大家在使用GD32的ADC的时候,是否有遇到过问题?我在STM芯片上运行正常的代码,修改HSE_STARTUP_TIMEOUT后,下载到GD的片子,ADC功能就不正常了。发现AD转换后的值全部都为0了,包括内部温度传感器和内部参考。找了GD的AN003,
QQ图片20130827213856.jpg 下面56MHz的ADC Prescaler应该为4。
GD32的ADC conversion rates up to 1 MHz。
而ST的ADC使用时,分频值可以为2的。ADC conversion time:– STM32F103xx performance line devices: 1 μs at 56 MHz (1.17 μs at 72 MHz)

我把ADC分频改为8以后,发现结果还是不正确。

是不是GD32的ADC与STM32的ADC还是有些性能差距的?
1988020566| | 2013-8-27 23:20 | 显示全部楼层
这个ADC还没有测试呢。

使用特权

评论回复
tonydong| | 2013-8-27 23:27 | 显示全部楼层
仅供参考:
关于GD到STM32的移植,主要在修改“#define HSE_STARTUP_TIMEOUT”,大部分的情况下是可以直接运行的。
GD&STM32虽然使用同样的ARM框架内核、同样的管脚定义做到PIN-TO-PIN,但由于内部结构存在差异,尤其是GD芯片执行效率和速度的提高(for循环或while循环做精确定时的,定时时间会由于代码执行速度加快而使循环的时间变短),存在时序上的差异,还需在特定场景应用下做适当的延时。

关于GD32--STM32的延时,亟待高手指点

使用特权

评论回复
tonydong| | 2013-8-27 23:30 | 显示全部楼层
修改HSE_STARTUP_TIMEOUT后,后面程序是否一直调用头文件?是否另作单独定义?这个都是需要检查的

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 08:56 | 显示全部楼层
tonydong 发表于 2013-8-27 23:30
修改HSE_STARTUP_TIMEOUT后,后面程序是否一直调用头文件?是否另作单独定义?这个都是需要检查的 ...

我检查过了,ADC这块没有调用HSE_STARTUP_TIMEOUT宏定义的。

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 08:56 | 显示全部楼层
求官方解释GD32与STM32的ADC差异

使用特权

评论回复
tonydong| | 2013-8-28 09:15 | 显示全部楼层
zhxi 发表于 2013-8-28 08:56
我检查过了,ADC这块没有调用HSE_STARTUP_TIMEOUT宏定义的。

那就必须做延时.....

使用特权

评论回复
GONGO| | 2013-8-28 09:32 | 显示全部楼层

关于 ADC 有三点需要注意,在 ADC APP DOC 里面有介绍。

1.在ADC ADON 置为 1 后需要等待一段时间,具体请看文档(楼主遇到的估计就是该问题)。

2.GD的ADC 在使用软件触发时,需要手动清 EOC。


3.采样时间和外部输入阻抗计算方法与ST不同。

使用特权

评论回复
s022793| | 2013-8-28 09:42 | 显示全部楼层

使用特权

评论回复
GDCM3OS| | 2013-8-28 09:50 | 显示全部楼层
系统时钟多少?
ADON后需要加延时

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 11:01 | 显示全部楼层
转换速度与ST的是不是也不同的?

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 11:08 | 显示全部楼层
void Temp_Init(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        /* ADCCLK = PCLK2/2 */
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
        /* Enable peripheral clocks ------------------------------------------------*/
        /* Enable DMA1 clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        /* Enable ADC1 and GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

        /* Configure PA.00 PA.01(ADC Channel0 1) as analog input -------------------------*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* DMA1 channel1 configuration ----------------------------------------------*/
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = ADC1_Buf_Len*4;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);

        /* Enable DMA1 channel1 */
        DMA_Cmd(DMA1_Channel1, ENABLE);

        /* ADC1 configuration ------------------------------------------------------*/
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 4;
        ADC_Init(ADC1, &ADC_InitStructure);

        ADC_TempSensorVrefintCmd(ENABLE);

        /* ADC1 regular channel0 1 configuration */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 4, ADC_SampleTime_55Cycles5);

        /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);

        /* Enable ADC1 */
        ADC_Cmd(ADC1, ENABLE);

        /* Enable ADC1 reset calibration register */   
        ADC_ResetCalibration(ADC1);
        /* Check the end of ADC1 reset calibration register */
        while(ADC_GetResetCalibrationStatus(ADC1));

        /* Start ADC1 calibration */
        ADC_StartCalibration(ADC1);
        /* Check the end of ADC1 calibration */
        while(ADC_GetCalibrationStatus(ADC1));
       
        /* Start ADC1 Software Conversion */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 11:08 | 显示全部楼层
在“ADC_Cmd(ADC1, ENABLE);”后增加延时?

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 11:10 | 显示全部楼层
在“ADC_SoftwareStartConvCmd(ADC1, ENABLE);”增加“ADC_ClearFlag(ADC1,ADC_FLAG_EOC);”?

使用特权

评论回复
GDCM3OS| | 2013-8-28 11:13 | 显示全部楼层
Ln59之后加延时

Ln52,Ln53:采样时间应该为17.1us

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 14:19 | 显示全部楼层
需要增加“ADC_ClearFlag(ADC1,ADC_FLAG_EOC);”语句吗?

使用特权

评论回复
GDCM3OS| | 2013-8-28 15:22 | 显示全部楼层
从已经贴出的代码来看,无法确定是否需要增加ADC_ClearFlag,因与之无关。

已有代码经过前述3处修改之后,程序运行有结果了吗?

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 15:40 | 显示全部楼层
还没试,晚上好好试试。谢谢各位

使用特权

评论回复
tonydong| | 2013-8-28 16:35 | 显示全部楼层
GD32-ADC文档,仅供参考

GD32F10xxx - AN003 ADC Application Note.pdf

196.7 KB

使用特权

评论回复
zhxi|  楼主 | 2013-8-28 20:00 | 显示全部楼层
tonydong 发表于 2013-8-28 16:35
GD32-ADC文档,仅供参考

谢谢楼上的,这个文件我已经有了。希望对其他用户有帮助。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

146

帖子

1

粉丝