前几天做项目用了一个测温电路,用热电偶测温,今天就和大家分享一下使用经验。 什么是热电偶? 当有两种不同的导体或半导体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输出数据可以通过发送16个脉冲信号来获得。 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); } /** *@briefmax读取6675模块检测到的原始数据 * @paramNone * @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 的使用心得。 --------------------- 作者:woai32lala 链接:https://bbs.21ic.com/icview-3225330-1-1.html 来源:21ic.com 此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。