本帖最后由 woai32lala 于 2022-5-21 10:49 编辑
#申请原创# @21小跑堂 MAX6675+ K型热电偶测温
前几天做项目用到一个测温电路,使用热电偶测温,今天来跟大家一起分享一下使用心得。
1、什么是热电偶
当有两种不同的导体或半导体A和B组成一个回路,其两端相互连接时,只要两结点处的温度不同,
一端温度为T,称为工作端或热端,另一端温度为TO,称为自由端(也称参考端)或冷端,回路中将
产生一个电动势,该电动势的方向和大小与导体的材料及两接点的温度有关。这种现象称为“热电效应”,
两种导体组成的回路称为“热电偶”,这两种导体称为“热电极”,产生的电动势则称为“热电动势”。
因此,我们通过测量热电偶之间的压差就会求得侧两端的温度。
2、测量方案
MCU:HC32F460 测温芯片 MAX6675 传感器: K型热电偶
为什么使用K型热电偶? K型热电偶具有线性度好,热电动势较大,灵敏度高,稳定性和均匀性较好,抗氧化性能强,价格便宜等优点,
能用于氧化性惰性气氛中。K型热电偶可以直接测量各种生产中从0℃到1300℃范围的液体蒸汽和气体介质
以及固体的表面温度。K型热电偶是目前用量最大的廉金属热电偶,从性能和成本上考虑我们采用K型热电偶。
MAX6675 这是一款专门用于测量K型热电偶芯,12-Bit, 0.25°C Resolution,最高测量温度为1024,符合我们使用条件。
3、使用方式
K型采用的SPI通讯协议
为了保证MCU的时钟边沿被MAX6675正确识别,MCU的SPI的时钟频率最好不超过该芯片最高时钟频率的1/2。
热电偶蓝色端接在MAX6675芯片T-,T-端通常接在PCB的地线。
热电偶红色端接在MAX6675芯片T+。
4、应用电路
原理图电路前方只加滤波电容,不能再加电阻,MAX6675内部是差分运放,外加电阻会改变原有的放大倍率。
5、代码
注意SPI的时钟极性和相位
MAX6675的CS管脚被拉低后,发送十六个脉冲信号就可得到输出数据。
MAX6675只有数据线只有MISO管脚。
//SPI 和 CS管脚初始化
void Max6675_GPIO_Init(void)
{
stc_spi_init_t stcSpiInit;
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enPullUp = Enable;
PORT_Init(MAX6675_SPI2_CS1_PORT, MAX6675_SPI2_CS1_PIN, &stcPortInit);
MAX6675_SPI2_CS_HIGH();
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcSpiInit);
/* Configuration peripheral clock */
PWC_Fcg1PeriphClockCmd(MAX6675_SPI2_UNIT_CLOCK, Enable);
/* Configuration SPI pin */
PORT_SetFunc(MAX6675_SPI2_SCK_PORT, MAX6675_SPI2_SCK_PIN, MAX6675_SPI2_SCK_FUNC, Disable);
PORT_SetFunc(MAX6675_SPI2_MISO_PORT,MAX6675_SPI2_MISO_PIN, MAX6675_SPI2_MISO_FUNC, Disable);
/* Configuration SPI structure */
stcSpiInit.enClkDiv = SpiClkDiv128;
stcSpiInit.enFrameNumber = SpiFrameNumber1;
stcSpiInit.enDataLength = SpiDataLengthBit8;
stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB;
stcSpiInit.enSckPolarity = SpiSckIdleLevelLow;
stcSpiInit.enSckPhase = SpiSckOddSampleEvenChange;
stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer;
stcSpiInit.enWorkMode = SpiWorkMode3Line;
stcSpiInit.enTransMode = SpiTransFullDuplex;
stcSpiInit.enCommAutoSuspendEn = Disable;
stcSpiInit.enModeFaultErrorDetectEn = Disable;
stcSpiInit.enParitySelfDetectEn = Disable;
stcSpiInit.enParityEn = Disable;
stcSpiInit.enParity = SpiParityEven;
stcSpiInit.enMasterSlaveMode = SpiModeMaster;
stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue;
stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1;
stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue;
stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1;
stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue;
stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2;
SPI_Init(MAX6675_SPI2_UNIT, &stcSpiInit);
SPI_Cmd(MAX6675_SPI2_UNIT, Enable);
}
/**
* @brief max6675模块读取测得的原始数据
* @param None
* @retval 温度的原始数据
*/
static uint16_t Max6675_ReadRawValue(channel)
{
uint16_t tmp;
//enable max6675
Max6675_Cs_Enable(channel);
tmp = Max6675_Write_Send_Byte(0XFF); //read MSB
tmp <<= 8;
tmp |= Max6675_Write_Send_Byte(0XFF); //read LSB
Max6675_Cs_Disable(channel);
if(tmp & 4)
{
// thermocouple open
tmp = 4095; //未检测到热电偶
}
else
{
tmp = tmp >> 3;
}
return tmp;
}
//温度分辨率
#define MAX6675_TEMPERATURE_RESOLUTION 0.25f
将SPI读取的数据x温度分辨率,就得到侧两端实际的温度值。
通过返回数据的第二个位,可以检测是否有热电偶是否插上。如果D2为0则表示有热电偶,否则没有。
再就是画PCB的时候,热电偶的冷端和 MAX6675原理图热量较大的元器件,避免检测误差。
以上 就是MAX6675 的使用心得。
|
感谢分享K型热电偶使用心得