打印

GD32实战__ADC

[复制链接]
1300|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tfqi|  楼主 | 2019-7-10 12:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
原理

​        我们知道自然界中很多量都是模拟量,而CPU只能识别数字量,为此,我们按一定的时间间隔对模拟量进行采样,并把采集到的值转换成数字量。

​        一般情况,ADC都要经过采样,保持,量化,编码四个过程。


使用特权

评论回复
沙发
tfqi|  楼主 | 2019-7-10 12:09 | 只看该作者
如何实现

首先,我们看下如何实现一个简单的ADC,如下图,


使用特权

评论回复
板凳
tfqi|  楼主 | 2019-7-10 12:09 | 只看该作者
模拟信号从UI输入后,通过比较器与UREF(假设是+UREF=3.2V,-UREF=0V)进行比较,每当采样脉冲到来时,就完成一次转化,转化结果如下表,参考下表,CPU只要读取编码器输出值,就可以知道模拟输入UI的电压值了。

使用特权

评论回复
地板
tfqi|  楼主 | 2019-7-10 12:10 | 只看该作者
使用举例硬件设计

如图,我们采集可变电阻的电压值。


使用特权

评论回复
5
tfqi|  楼主 | 2019-7-10 12:11 | 只看该作者
软件设计
代码很简单,如下

static VOID ADC_GpioConfig(VOID)
{
    GPIO_InitPara GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AIN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

static VOID ADC_AdcConfig(VOID)
{
    ADC_InitPara ADC_InitStructure;

    ADC_InitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;
    ADC_InitStructure.ADC_Mode_Scan = DISABLE;
    ADC_InitStructure.ADC_Mode_Continuous = ENABLE;
    ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
    ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
    ADC_InitStructure.ADC_Channel_Number = 1 ;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_13, 1, ADC_SAMPLETIME_71POINT5);
    ADC_Enable(ADC1, ENABLE);
    ADC_Calibration(ADC1);
    ADC_SoftwareStartConv_Enable(ADC1, ENABLE);
}

VOID DRV_ADC_Init(VOID)
{
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOC , ENABLE);
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV12);

    ADC_GpioConfig();
    ADC_AdcConfig();
}

U16 DRV_ADC_GetConversionValue(VOID)
{
    return ADC_GetConversionValue(ADC1);
}


使用特权

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

本版积分规则

57

主题

3317

帖子

4

粉丝