芯片:STM32F103c8
通信方式:spi
一、MAX6675传感器介绍
MAX6675是一复杂的单片热电偶数字转换器,内部具有信号调节放大器、12位的模拟/数字化热电偶转换器、冷端补偿传感和校正、数字控制器、1个SPI兼容接口和1个相关的逻辑控制。
MAX6675时序图
MAX6675的主要特性如下:
①简单的SPI串行口温度值输出;
②0℃~+1024℃的测温范围;
③12位0.25℃的分辨率;
④片内冷端补偿;
⑤高阻抗差动输入;
⑥热电偶断线检测;
⑦单一+5V的电源电压;
⑧低功耗特性;
⑨工作温度范围-20℃~+85℃;
⑩2000V的ESD信号。
二、接线说明
传感器接口电路原理图
引脚说明
MAX6675模块 | 引脚说明 |
---|---|
VCC | 正极 3.3/5V供电 |
GND | 负极 接GND |
SCK | 时钟输入引脚 |
CS | 片选信号引脚 |
SO | 数据输出引脚 |
本文使用的是stm32f103c8t6的芯片 ,引脚连接关系如下:
PA6-MISO:MAX6675-SO
PA7-MOSI:MAX6675-SI
PA5-SCK :MAX6675-SCK
PA4-NSS :MAX6675-CS
OLED的配置及引脚连接参考之前的文章。
三、代码编写
1.变量及引脚定义
uint8_t ucbuf[17];
#define MAX6675_CS GPIO_Pin_4
#define MAX6675_CSL() GPIOA->BRR = MAX6675_CS;
#define MAX6675_CSH() GPIOA->BSRR = MAX6675_CS;
2.SPI1初始化(MAX6675接口初始化):
void SPI_MAX6675_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/* 使能 SPI1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
/* ---------通信I/O初始化----------------
* PA5-SPI1-SCK :MAX6675_SCK
* PA6-SPI1-MISO:MAX6675_SO
* PA7-SPI1-MOSI:MAX6675_SI
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* ---------控制I/O初始化----------------*/
/* PA4-SPI1-NSS:MAX6675_CS */ // 片选
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推免输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4); // 先把片选拉高,真正用的时候再拉低
/* SPI1 配置 */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
/* 使能 SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
3.MAX6675读取SPI数据:
unsigned char MAX6675_ReadByte(void)
{
/* Loop while DR register in not emplty */
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPI1, 0xff);
/* Wait to receive a byte */
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI1);
}
4.main函数代码:
main (void)
{
unsigned int t,i;
unsigned char c;
unsigned char flag;
float temprature;
/* 配置系统时钟为72M */
SystemInit();
/* MAX6675 SPI 接口初始化 */
SPI_MAX6675_Init();
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
while(1)
{
OLED_Refresh();
MAX6675_CSL();
c = MAX6675_ReadByte();
i = c;
i = i<<8;
c = MAX6675_ReadByte();
MAX6675_CSH();
i = i|((unsigned int)c); //i是读出来的原始数据
flag = i&0x04; //flag保存了热电偶的连接状态
t = i<<1;
t = t>>4;
temprature = t*0.25;
if(i!=0) //max6675有数据返回
{
if(flag==0) //热电偶已连接
{
sprintf((char*)ucbuf,"%4.1f",temprature);
OLED_ShowString(72,16,(uint8_t*)ucbuf,16,1);
OLED_ShowChinese(0,16,0,16,1); //当
OLED_ShowChinese(16,16,1,16,1); //前
OLED_ShowChinese(32,16,2,16,1); //温
OLED_ShowChinese(48,16,3,16,1);//度
OLED_ShowChar(64,16,':',16,1);
OLED_ShowChinese(112,16,4,16,1);
}
}
else //max6675没有数据返回
{
OLED_Clear();
OLED_ShowChinese(0,16,5,16,1); //无
OLED_ShowChinese(16,16,6,16,1); //数
OLED_ShowChinese(32,16,7,16,1); //据
}
for(i=0;i<0x2fffff;i++); //max6675的转换时间是0.2秒左右,所以两次转换间隔不要太近
}
}
OLED的初始化代码以及内容显示参考之前的文章,本文不再说明。
四、实验结果
此代码保留小数点后一位小数(四舍五入进位)。
五、结语
MAX6675将热电偶测温应用时复杂的线性化、冷端补偿及数字化输出等问题集中在一个芯片上解决,简化了将热电偶测温方案应用于嵌入式系统领域时复杂的软硬件设计,因而该器件是将热电偶测温方案应用于嵌入式系统领域的理想选择。文章来源:https://www.toymoban.com/news/detail-796886.html
完整例程参考主页下载程序,有不妥之处欢迎指正,邮箱2689309822@qq.com文章来源地址https://www.toymoban.com/news/detail-796886.html
到了这里,关于通过stm32读取max6675的温度值并在显示屏上显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!