stm32f103c8t6学习 多通道数模转换

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "adc.h"

uint16_t ad0,ad1,ad2,ad3;

int main(void)
{
	OLED_Init();//初始化外设
	ad_init();
	
	OLED_ShowString(1,1,"ad0:");
	OLED_ShowString(2,1,"ad1:");
	OLED_ShowString(3,1,"ad2:");
	OLED_ShowString(4,1,"ad3:");
	
	while(1)//死循环
	{
		ad0=ad_getvalue(ADC_Channel_0);
		ad1=ad_getvalue(ADC_Channel_1);
		ad2=ad_getvalue(ADC_Channel_2);
		ad3=ad_getvalue(ADC_Channel_3);
		
		OLED_ShowNum(1,5,ad0,4);
		OLED_ShowNum(2,5,ad1,4);
		OLED_ShowNum(3,5,ad2,4);
		OLED_ShowNum(4,5,ad3,4);

	}
}

多通道adc.c

#include "stm32f10x.h"                  // Device header

void ad_init(void)//rcc时钟(gpio,adc,adcclock)→配置gpio模拟输入模式→接入ad转换器,使用规则组列表→配置adc转换器→开关开启adc
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//adc时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//adcclock=72m/6=12m adc分频→逐次逼近 
	
	GPIO_InitTypeDef GPIO_InitStruct;//定义结构体 初始化gpio中一参数
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;//模拟输入模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//使用gpio_a0,gpio_a1,gpio_a2,gpio_a3
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化gpio
	
	ADC_InitTypeDef ADC_InitStruct;//定义结构体 初始化adc中一参数
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//选择独立模式
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//触发源 使用软件触发
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//是否连续转换
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;//是否扫描模式
	ADC_InitStruct.ADC_NbrOfChannel=1;//扫描模式下,使用通道数
	ADC_Init(ADC1, &ADC_InitStruct);//初始化adc
	
	ADC_Cmd(ADC1, ENABLE);//开启adc供电
	
	//adc校准
	ADC_ResetCalibration(ADC1);//复位校准
	while(ADC_GetResetCalibrationStatus(ADC1)==SET);//等待返回复位校准完成(复位校准标志位为1,校准完成后清零),0时跳出死循环
	ADC_StartCalibration(ADC1);//开始校准
	while(ADC_GetCalibrationStatus(ADC1)==SET);//获取校准状态,等待校准完成(复位校准标志位为1,校准完成后清零),0时跳出死循环
	
}
uint16_t ad_getvalue(uint8_t ADC_Channel)//取转换结果 使用单次转换非扫描模式实现ad多通道
{
	ADC_RegularChannelConfig(ADC1,ADC_Channel, 1, ADC_SampleTime_41Cycles5);//配置输入通道 选择adc1通道ADC_Channel,将通道0放置于规则组次序1,指定通道采样时间(越短越快,越慢越准)
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发ad转换
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//等待转换完成,完成后eoc标志位置1,跳出死循环
	return ADC_GetConversionValue(ADC1);//返回转换结果
	
}

adc.h

#ifndef __ad_h 
#define __ad_h 

void ad_init(void);
uint16_t ad_getvalue(uint8_t ADC_Channel);

#endif

OLED模块前有介绍

运行效果

多通道数模转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值