目录
[3.注入序列的编程接口 以及初始化ADC的(注入序列)](#3.注入序列的编程接口 以及初始化ADC的(注入序列))
[5 读取并发送测量结果](#5 读取并发送测量结果)
一、实验目的
使用ADC实现:根据光敏传感器的光照强弱去得到不同的输入电压对应的量化结果码,既而根据得到的量化值*分辨率得到不同的电压 然后使用定时器实现每ms 就使用USART发送一个电压值,最后使用 软件去读取一个个周期下的测量结果并连接成曲线,而这个电压值的曲线也表示了光照的变化幅度(因为日光灯照度一般10lux,其对应的AO输出电压为1.5V,所以以1.5V为边界实现板载灯的亮灭)。

二、电路连接

三、实验执行
1.初始化串口

2.配置定时器1的TRGO

3.注入序列的编程接口 以及初始化ADC的(注入序列)
(1)首先是注入序列的编程接口的介绍:
注入序列里面的:
第一个编程接口是设置注入序列的长度,总共是四个
第二个编程接口是配置注入序列的通道,包括通道序号和采样时间
之后的都和前面的常规序列相似
(2)ADC的初始化(五步)
4.1.初始化IO引脚
4.2.配置时钟
4.3.配置ADC的基本参数
4.4.配置注入序列
4.5.闭合总开关
5 读取并发送测量结果

VOFA的使用
数据格式/数据引擎这里可以选择FileWater或者其他,看介绍就行




四、代码
#include "stm32f10x.h"
#include "Delay.h"
#include "usart.h"
void App_USART_Init(void);
void App_TIM_Init(void);
void App_ADC_Init(void);
int main(void)
{
//使用ADC实现定时器触发的单通道转换 并在VOFA实现电压信号的波形图
//首先初始化USART
//之后初始化定时器的 TGO 去发生每ms的固定的时钟信号
//ADC初始化五大步
//其中注意输入电压的内阻已经得到,并且因此得到的采样时间是10.24cycle
App_USART_Init();
App_TIM_Init();
App_ADC_Init();
//先清零EOC
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
while(1)
{
//当EOC为1的时候,输出电压
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
//清零EOC,下次循环用
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
uint16_t res=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
float volt=res*(3.3f/4095);
My_USART_Printf(USART1,"%.3f\n",volt);
}
}
void App_TIM_Init(){
//初始化定时器
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
//初始化TIM
TIM_TimeBaseInitTypeDef TIM_InitStruct={0};
TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_InitStruct.TIM_Period=999;
TIM_InitStruct.TIM_Prescaler=71;
TIM_InitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_InitStruct);
TIM_ARRPreloadConfig(TIM1,ENABLE);
//开启从模式控制器的Update模式
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
TIM_Cmd(TIM1,ENABLE);
}
void App_USART_Init(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitTypeDef USART_InitStruct={0};
USART_InitStruct.USART_BaudRate=115200;
USART_InitStruct.USART_Mode=USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
}
void App_ADC_Init(){
//首先就是初始化ADC的IO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//初始化后开启时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
//初始化ADC
ADC_InitTypeDef ADC_InitStruct={0};
ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel=1;
ADC_InitStruct.ADC_ScanConvMode=DISABLE;
ADC_Init(ADC1,&ADC_InitStruct);
//配置注入序列(注意比常规的要多配置两个)
ADC_InjectedSequencerLengthConfig(ADC1,1);
ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_T1_TRGO);
ADC_InjectedChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_13Cycles5);
ADC_ExternalTrigConvCmd(ADC1,ENABLE);
//开启总开关
ADC_Cmd(ADC1,ENABLE);
}