stm32学习之ADC

借助江协科技ppt学习STM32F103C8T6

ADC1和ADC2通道引脚一样的

AD.c://例子adc单次扫描不连续

#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{   
//时钟配置
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);

//GPIO配置
	GPIO_InitTypeDef GPIO_InitStruct;                   //定义结构体变量
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN ;
	GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_0 ;
	GPIO_InitStruct.GPIO_Speed=  GPIO_Speed_50MHz  ;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

//通道选择(注入组还是规则组)
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//为所选ADC配置其对应的常规通道
	
//ADC配置
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_DataAlign =  ADC_DataAlign_Right;            // 右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不外部触发
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;                 //单通道模式
	ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;                //连不连续
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;                      //扫不扫描   
	ADC_InitStruct.ADC_NbrOfChannel = 1 ;                           //一次多少组
	ADC_Init(ADC1,&ADC_InitStruct);
	
	ADC_Cmd(ADC1,ENABLE);
	
//校准部分
	ADC_ResetCalibration(ADC1);//复位校准
  while(ADC_GetResetCalibrationStatus(ADC1) == SET);//等待完成ADC复位校准。
  ADC_StartCalibration(ADC1);//开始校准
	while(ADC_GetCalibrationStatus(ADC1) == SET );//等待校准完成
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC软件启动转换   连续扫描 
    //连续扫描不需要等待转换
}

uint16_t ADC_GetValue(void)
{
  //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ADC软件启动转换   单次扫描
	//while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);// 单次扫描 EOC标志位为1时转换完成 EOC=1
	//采样周期55.5加转换周期12.5=68个ADC周期,ADC时钟72/6=12M表示一个周期为1/12M,
	//等待时间为(1/12M)*68=5.6us
	//DR寄存器会自动清除EOC标志位
	return ADC_GetConversionValue(ADC1);
}

主函数: 

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.H"
#include "AD.H"
//单次转换非扫描 只能显示一个
float voltage;
uint16_t ADvalue;
int main()
{    
	   AD_Init();
	   OLED_Init();
	   OLED_ShowString(1,1,"ADvalue:");
	   OLED_ShowString(2,1,"voltage:0.00");
	   
	  
    while(1)
		{	
			ADvalue = ADC_GetValue();
			voltage = (float)ADvalue /4096 * 3.3 ;
			
			OLED_ShowNum(1,9,ADvalue,4);
			OLED_ShowNum(2,9,voltage,1);
			OLED_ShowNum(2,11,(uint16_t)(voltage*100)%100,2);//小数部分
			Delay_ms(100);
		}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值