完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用的是某宝买来的STM32F103C8的核心板,原理图如下
实验电路为核心板加USB转TTL,其他并无外设。 尝试使用内部的ADCx_IN16连接的内部的温度传感器做实验,但是测出的结果一直都是十七点几,而且不增反降,结果是利用串口显示如图 现将关于温度传感器数值转化和ADC部分代码(temper.c文件全部内容)粘贴如下: //temper.c文件起始 void Temprt_Init( void ) { ADC_InitTypeDef ADC_InitStructure; //使能GPIOA,ADC1通道时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE ); //将外设 ADC1 的全部寄存器重设为缺省值 ADC_DeInit( ADC1 ); //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //模数转换工作在单通道模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在单次转换模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //ADC数据右对齐 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //顺序进行规则转换的ADC通道的数目 ADC_InitStructure.ADC_NbrOfChannel = 1; //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5); ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //重置指定的ADC1的复位寄存器 //获取ADC1重置校准寄存器的状态,设置状态则等待 while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待 ADC_SoftwareStartConvCmd(ADC1,ENABLE); } uint16_t T_Get_Adc(uint8_t ch) { ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,第一个转换,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 } //得到ADC采样内部温度传感器的值 取10次,然后平均 uint16_t T_Get_Temp(void) { uint16_t temp_val=0; uint8_t t; for(t=0;t<10;t++) { temp_val+=T_Get_Adc(ADC_Channel_16); DelayNms(5); } return temp_val/10; } //获取通道ch的转换值 取times次,然后平均 uint16_t T_Get_Adc_Average(uint8_t ch,uint8_t times) { uint32_t temp_val=0; uint8_t t; for(t=0;t temp_val+=T_Get_Adc(ch); DelayNms(5); } return temp_val/times; } //得到温度值 返回值:温度值(扩大了100倍,单位:℃.) short Get_Temprate(void) //获取内部温度传感器温度值 { uint32_t adcx; short result; double temperate; adcx=T_Get_Adc_Average(ADC_Channel_16,20); //读取通道16,20次取平均 temperate=(float)adcx*(3.3/4096); //电压值 temperate=(1.42-temperate)*1000/4.35+25; //转换为温度值 result=temperate*=100; //扩大100倍. return result; } //temper.c文件结束 在主函数中添加初始化函数后,在循环中添加将整形转化为浮点型,并发送到串口显示就是我的串口结果图。帖子省略代码部分为串口设置部分,使用主频是72MHz。 temperature = (uint8_t)(temperature_read /100) + (temperature_read %100) * 0.01; 希望能偶遇大神解决这个问题。 |
|
相关推荐
1 条评论
2个回答
|
|
|
|
1 条评论
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 13:36 , Processed in 1.110578 second(s), Total 103, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号