https://static.assets-stash.eet-china.com/album/old-resources/2009/10/25/9743459c-84be-49cf-b184-8dcdd37a7ffd.rar现在支持六个命令了:使用help可显示其他五个命令
STM32设备之温度传感器程序设计(二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、程序流程设计
通过边看书,边记录,对应ADC已经有了大概的掌握。下面是程序编写流程。
1、添加命令处理
主要是在命令表中添加字符串命令和对应的处理程序、在help命令处理中显示相应的命令。
2、命令处理程序的编写:CmdTemp()
软件激活温度传感器AD转换;
等到AD转换完成;
将数字量转换为温度;
对温度进行格式化字符串处理;
显示温度值;
3、为了使用AD转换,必须进行初始化
配置ADC,非连续转换,扫描模式一个通道,(一个通道、单次转换)右对齐,软件触发。
选择通道、配置采样时间。启用温度传感器。
二、设计过程记录
1、添加命令:过程比较简单,很快实现了。
2、编写命令处理程序CmdTemp()
void CmdTemp(void){
u16 TempData;
float TempVoltage; // 实际模拟电压值
float TempValue; //温度值,为浮点数
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动AD转换
while ( ADC_GetFlagStatus ( ADC1, ADC_FLAG_EOC ) == RESET ); //等待转换完成
TempData= ADC_GetConversionValue ( ADC1 ); //获取转换值
TempVoltage = ( TempData * 3.3 )/0xFFF ; //转换为实际模拟电压值
TempValue = ( 1000 * TempVoltage - 1430 )/4.3 + 25; //根据温度与电压关系获得温度值
/*将浮点数格式化为2.1格式*/
sprintf ( (char*)s , "Temp:%<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2.1f C\n" , TempValue );
Shell_PutString ( s ); //在屏幕上显示
}
3、初始化ADC
首先在stm32f103x_conf文件中定义ADC和ADC1。
还要使能ADC1的时钟。然后进行配置。
void ADC_Config(void){
ADC_InitTypeDef ADC_InitStructure; //进行ADC设置的数据结构
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ; //独立模式,只有一个ADC
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ; //一次性扫描
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;//软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ; //数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1 ; //只用温度传感器通道
ADC_Init ( ADC1, &ADC_InitStructure );
/*使用通道16,排在第一位,采样周期55.5个周期*/
ADC_RegularChannelConfig ( ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5 );
ADC_TempSensorVrefintCmd ( ENABLE ); //使能温度传感器
ADC_Cmd ( ADC1, ENABLE ); //使能ADC1
}
四、编写过程中的总结
1、开始没有使能ADC的时钟。
2、然后又忘了使能ADC1本身。
3、sprinf用法不对,现在还显示不出来。去查c语言的书。
TempData= ADC_GetConversionValue ( ADC1 ); //获取转换值
TempVoltage = ( TempData * 3.3 )/0xFFF ; //转换为实际模拟电压值
TempValue =(u8)( ( 1430-1000 * TempVoltage )/4.3 + 25 ); //根据温度与电压关系获得温度值
/*将整数转变为02d格式,不会超过100度的*/
sprintf ( (char*)s , "Temp:%02d" , TempValue );
Shell_PutString ( s ); //在屏幕上显示
Shell_PutString ("\n");
浮点格式老不对,改成u8或者s16数据类型,显示成功。是什么原因呢?
用户1569399 2010-11-10 16:52