STM32F030 12位高精度ADC用法

STM32F030C8有一个12位ADC接口,现用库函数编写ADC驱动代码

1.初始化接口,配置ADC参数通道

void bsp_adc_init(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  //打开GPIOA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //打开ADC1的时钟
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  //硬件接在PA4上
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;    //GPIO用作模拟输入
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;   //无需内部上拉下拉
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    ADC_DeInit(ADC1); //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值
     /* Initialize ADC structure */
    ADC_StructInit(&ADC_InitStructure); //初始化成员,下面再给成员赋值

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//f030是12bit
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    ADC_Init(ADC1, &ADC_InitStructure); //根据指定的参数初始化外设 ADCx

      ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_239_5Cycles);  //PA4对应ADC是通道4,见下面规格书截图,采样周期配置最大时间周期
    
      /* ADC Calibration */
    ADC_GetCalibrationFactor(ADC1);

    /* Enable the ADC peripheral */
    ADC_Cmd(ADC1, ENABLE);     

    /* Wait the ADRDY flag */
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); 

    /* ADC1 regular Software Start Conv */ 
    ADC_StartOfConversion(ADC1);
}

2.获取数据,转换数据

static u16 Get_Adc(u8 ch)
{
    //设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间
    ADC_ChannelConfig(ADC1, ch, ADC_SampleTime_239_5Cycles);//ADC1,规则采样顺序值为 1,采样时间为 239.5 周期
    ADC_ContinuousModeCmd(ADC1, ENABLE); //使能软件转换功能
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )== RESET);//等待转换结束
    return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果
}

//多次采样,获取平均值

static u16 Get_Adc_Average(u8 ch, u8 times)
{
    u32 temp_val=0;
    u8 t;
    for(t=0;t<times;t++)
    { 
        temp_val+=Get_Adc(ch);
        delay_ms(5);
    }
    return temp_val/times;
}

//获取测量的电压对应等份

float Get_Battery_Voltage(void)
{
    u16 adcx;
    float temp;

    adcx=Get_Adc_Average(ADC_Channel_4, 10);  //选择通道4,10次采集求平均
    temp=(float)adcx/4096;  //12bit,2^12=4096
    return temp;   
}

3.调用接口,求出ADC口电压

对应IO口是TTa结构,最大电压是3.3V,因此测量的电压=Get_Battery_Voltage()*3.3(V)

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的抉择

每周至少一篇,感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值