- 实验要求
- 效果图
- 外设电路
- STM32的ADC采样
- 配置ADC的过程
- 程序实现
- main
- tim3配置
-
实验要求
效果图
外设电路
采用热敏电阻,通过分压法测出阻值,然后根据热敏电阻值和温度的曲线逐段线性得到实际温度值.测量电压的时候是用STM32的ADC采样.这里用运放是为了减少漏电流的影响
STM32的ADC采样
STM32使用的是一种12位逐次逼近模拟数字转换ADC.可以测量16个外部和2个内部信号源.
ADC采样的参考电压由给ADC供电的电压决定,开发板上供电部分的电压为3.3V.因此ADC的精度就是3.3/(2^12)=3.3/4096 V
配置ADC的过程
- 开启相应的外设时钟(GPIO、ADC、AFIO)
- 配置ADC采样的IO口为模拟输入模式
- 配置ADC各项参数(一般用单次采样模式)
- 配置定时器及响应中断
- 定时器中断函数中单次采样,以此灵活控制ADC的采样频率
-
void ADC() { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //设置ADC1和ADC2工作在独立工作模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 设置ADC工作在扫描模式(多通道),如果只需要一个通道,配置为单通道模式 DISABLE ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //设置ADC工作在单次模式(使能一次,转换一次;也可以配置连续模式,自动周期性采样 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //设置转换由软件触发,不用外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //设置进行转换的通道数目为5 ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC1 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_239Cycles5); //设置ADC1的通道0第一个进行转换,采样时钟周期239.5个 ADC_Cmd(ADC1, ENABLE); //使能ADC1 ADC_ResetCalibration(ADC1); //重置ADC1的校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); //等待ADC1校准重置完成 ADC_StartCalibration(ADC1); //开始ADC1校准 while(ADC_GetCalibrationStatus(ADC1)); //等待ADC1校准完成 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换 } void TIM3_IRQHandler(void) //TIM3的溢出更新中断响应函数 { float Vx; TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清空TIM3溢出中断响应函数标志位 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始单次模式数据转换 AD1_Value=ADC_GetConversionValue(ADC1); Vx = (AD1_Value * 3.3) / 4095; resistence =(10*Vx) / (3.3-Vx); //计算此时电阻 }
void ADC()
{
ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //设置ADC1和ADC2工作在独立工作模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 设置ADC工作在扫描模式(多通道),如果只需要一个通道,配置为单通道模式 DISABLE
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //设置ADC工作在单次模式(使能一次,转换一次;也可以配置连续模式,自动周期性采样
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //设置转换由软件触发,不用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //设置进行转换的通道数目为5
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC1ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_239Cycles5); //设置ADC1的通道0第一个进行转换,采样时钟周期239.5个
ADC_Cmd(ADC1, ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1); //重置ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待ADC1校准重置完成ADC_StartCalibration(ADC1); //开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1)); //等待ADC1校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}
void TIM3_IRQHandler(void) //TIM3的溢出更新中断响应函数
{
float Vx;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清空TIM3溢出中断响应函数标志位
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开始单次模式数据转换
AD1_Value=ADC_GetConversionValue(ADC1);
Vx = (AD1_Value * 3.3) / 4095;
resistence =(10*Vx) / (3.3-Vx); //计算此时电阻
} -
程序实现
main
int main(void) { int kk=0; RCC_Configuration(); GPIO_Configuration(); ADC(); nvic(); tim3(); Nixie_Configuration(); delay_nms(500); while(1) { int ii,jj,ans=0,count=0; float deta,origin; for(ii=0;ii<55;ii++){ count =0; if(resistence <= RESLIST[ii] && resistence >= RESLIST[ii+1]) { ans =(ii-10)*10 + 10*(RESLIST[ii] - resistence) /(RESLIST[ii] - RESLIST[ii+1]); break; } } for(kk=0;kk<200;kk++){ NumDisplay(ans); } } }
int main(void) { int kk=0; RCC_Configuration(); GPIO_Configuration(); ADC(); nvic(); tim3(); Nixie_Configuration(); delay_nms(500); while(1) { int ii,jj,ans=0,count=0; float deta,origin; for(ii=0;ii<55;ii++){ count =0; if(resistence <= RESLIST[ii] && resistence >= RESLIST[ii+1]) { ans =(ii-10)*10 + 10*(RESLIST[ii] - resistence) /(RESLIST[ii] - RESLIST[ii+1]); break; } } for(kk=0;kk<200;kk++){ NumDisplay(ans); } } }
-
tim3配置
void tim3() //配置TIM3为基本定时器模式 ,约100Hz { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义格式为TIM_TimeBaseInitTypeDef的结构体的名字为TIM_TimeBaseStructure TIM_TimeBaseStructure. TIM_Period =9999; //配置计数阈值为9999,超过时,自动清零,并触发中断 TIM_TimeBaseStructure.TIM_Prescaler =71; // 时钟预分频值,定时器的计数的频率等于主时钟频率除以该预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频倍数(用于数字滤波,暂时无用) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式为向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化tim3 TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3溢出中断标志 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); // 使能TIM3的溢出更新中断 TIM_Cmd(TIM3,ENABLE); // 使能TIM3 }
STM32——电子温度计
最新推荐文章于 2024-07-24 14:38:22 发布