stm32 ADC模数转换器

 内部信号源:内部温度传感器、内部基准电压

 

 规则通道:数据要通过DMA及时转运

 ADC开启触发源(触发控制):1、软件触发2、硬件触发(如图)--例如配置定时器更新事件为TRGO输出

 规则组、注入组完成转化后会产生EOC信号,置一个标志位,也可以申请中断

 

通道和引脚关系

转换模式:单次转换/连续转换

                 扫描模式/非扫描模式    上下可对应组合,共4种模式

 选择一个序列1其中为通道2,触发一次转换一次,转换完成后EOC置1,转换结果存入数据寄存器

 触发一次之后一直开始转换

 设定序列通道数量以及对应通道号,触发一次后按顺序依次对每个通道进行adc转换,此时转换结果需要DMA及时转走,全部结束后EOC置1

 同上,还有一种间断模式,可以暂停,需要再次触发才能继续转换

 

结果对齐方式,一般选右对齐,即左边多余处补0 ,如果需要降低精度,可以选择左对齐,然后只取左边高8位 

 采样时间:对输入信号采样并保持的时间(越长越稳定)

ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。故一般采用6分频、8分频

12位ADC,故需要至少12个周期进行量化编码

ADC启动时需要校准

初始化步骤

1、开启RCC时钟:GPIO+ADC ,配置ADC分频器ADCCLK

2、GPIO配置为模拟输入模式

3、配置通道开关(规则组/注入组)

4、配置ADC

5、(可选)配置模拟看门狗以及中断

6、ADC_CMD、校准

void ADC_int(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
    
    //ADCCLK 12MHZ
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//此处只能6、8分频,因为APB2没有分频,为72MHZ,ADC时钟不得超过14MHZ
    
    GPIO_InitTypeDef GPIO_InitStructure;	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟量输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

    
    //规则组设置
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);//采样时间:55.5个ADCCLK周期
    
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//是否开启连续转换模式,否则为单次转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐:右对齐
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发源选择:采用软件触发
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC单独工作,非双ADC模式
    ADC_InitStructure.ADC_NbrOfChannel = 1;//ADC转换通道数
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式,一次转换一个序列
    ADC_Init(ADC1, &ADC_InitStructure);
    
    ADC_Cmd(ADC1, ENABLE);
    
    
    //校准
    ADC_ResetCalibration(ADC1);                                           //复位校准
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);                            //获取复位校准状态,复位校准完成为0,否则一直循环等待
    ADC_StartCalibration(ADC1);                                           //开始校准
     while (ADC_GetCalibrationStatus(ADC1) == SET);                                 //获取校准状态,校准完成为0,否则一直循环等待
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启转换
}

//触发一次软件触发,并获取结果
uint16_t ADC_GetValue(void)
{
     
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//转换结束跳出循环,转换完成后EOC置1
    return ADC_GetConversionValue(ADC1); //读取DR寄存器的值会自动清除EOC标志位
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值