目录
一 芯片概述
芯片:STM32F103c8
通信方式:spi
二 MAX6675传感器介绍
2.1 原理简介
MAX6675是一复杂的单片热电偶数字转换器,内部具有信号调节放大器、12位的模拟/数字化热电偶转换器、冷端补偿传感和校正、数字控制器、1个SPI兼容接口和1个相关的逻辑控制。
2.2 芯片时许图
MAX6675时序图
2.3 MAX6675的主要特性
①简单的SPI串行口温度值输出;
②0℃~+1024℃的测温范围;
③12位0.25℃的分辨率;
④片内冷端补偿;
⑤高阻抗差动输入;
⑥热电偶断线检测;
⑦单一+5V的电源电压;
⑧低功耗特性;
⑨工作温度范围-20℃~+85℃;
⑩2000V的ESD信号。
三 接线说明
3.1 接口电路原理图
传感器接口电路原理图
3.2 引脚说明
MAX6675模块 | 引脚说明 |
---|---|
VCC | 正极 3.3/5V供电 |
GND | 负极 接GND |
SCK | 时钟输入引脚 |
CS | 片选信号引脚 |
SO | 数据输出引脚 |
3.3 单片机引脚连接
本文使用的是stm32f103c8t6的芯片 ,引脚连接关系如下:
PA6-MISO:MAX6675-SO
PA7-MOSI:MAX6675-SI
PA5-SCK :MAX6675-SCK
PA4-NSS :MAX6675-CS
OLED的配置及引脚连接参考之前的文章。
四、代码编写
4.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;
4.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);
}
4.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.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的初始化代码以及内容显示参考之前的文章,本文不再说明。
0.96寸OLED显示屏显示字符串、汉字(stm32标准库)_stm32oled文字库-CSDN博客
五 实验结果
此代码保留小数点后一位小数(四舍五入进位)。
六 结语
MAX6675将热电偶测温应用时复杂的线性化、冷端补偿及数字化输出等问题集中在一个芯片上解决,简化了将热电偶测温方案应用于嵌入式系统领域时复杂的软硬件设计,因而该器件是将热电偶测温方案应用于嵌入式系统领域的理想选择。
完整例程参考主页下载程序,有不妥之处欢迎指正,邮箱[email protected]