微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 移植ds18b20到stm32f103遇到的问题

移植ds18b20到stm32f103遇到的问题

时间:12-02 来源:互联网 点击:
之前在AVR单片机上用过DS18B20温度传感器,现在需要在STM32F103平台下使用,就直接在原先的代码基础上做了相应修改,调试时遇到的问题是测量值总是显示127.9375(读取的温度数据为0x7fff),用示波器看波形也没有发现问题,以为是18B20出问题了,又回到AVR下测试,结果正常。后来发现,不同之处在于供电:AVR用的5V,而STM32是3.3V。把18B20的供电电压换成5V就能正常工作了。又测试了18B20用3.3V供电,DQ脚5V上拉,测量数据还是不对,而且与上拉电阻值无关。数据手册上明明写的供电电压3~5.5V,难道是管子的问题?

总结一下STM32与AVR单片机在使用DS18B20的区别。

18B20使用一线值,单片机控制DQ引脚既需要输出电平,同时需要读取引脚电平。AVR单片机是通过设置DDRx寄存器来控制引脚的输入/输出状态。读引脚时,读取PIN,输出的时候写PORT。STM32的引脚可以配置为开漏输出模式,读输入数据寄存器就可得到引脚状态,省去来回切换输入输出模式,需要加上拉电阻。并且按照18B20数据手册,DQ引脚需要4.7k上拉电阻。

/*
*********************************************************************************************************
* 函 数 名: DS18B20_GPIOConfiguration
* 功能说明: 18b20端口配置为开漏输出
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void DS18B20_GPIOConfiguration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(DQ_GPIORCC, ENABLE);

DQ_1; // 需要先写输出寄存器为1,否则初始化后默认输出0
GPIO_InitStructure.GPIO_Pin = Pin18B20;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO18B20, &GPIO_InitStructure);
}
uint8_t BUSY(void) //读温度传感器数据引脚
{
return GPIO_ReadInputDataBit(GPIO18B20, Pin18B20);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top