开源改变世界

MAX6675 HEAT_INTERVAL 未定义。 #867

推推 grbl 3年前 (2023-02-06) 257次浏览
关闭
JTrantow 打开了这个问题 2014 年 4 月 3 日 · 6条评论
关闭

MAX6675 HEAT_INTERVAL 未定义。#867

JTrantow 打开了这个问题 2014 年 4 月 3 日 · 6条评论

评论

MAX6675 HEAT_INTERVAL 未定义。 #867
  1. 选择 MAX6675 作为温度传感器时,代码将无法编译。
    看起来有人将 HEAT_INTERVAL 更改为 MAX6675_HEAT_INTERVAL 但忘记在初始化程序中使用它。

  2. read_max6675() 仍然插入了完全不必要的延迟。没有理由向中断中调用的函数添加不必要的延迟。

  3. read_max6675() 不检查可用于检测设备是否存在的状态位。

我附上了解决这些问题的代码以及相关评论。
请用此改进替换现有功能。问题 2) 和 3) 很久以前就已涵盖,但从未将其写入代码。

如果已定义(HEATER_0_USES_MAX6675)

定义 MAX6675_HEAT_INTERVAL 250 //!< 读取 MAX6675 的时间 [毫秒]。

静态长 max6675_previous_millis = -MAX6675_HEAT_INTERVAL;// 初始化以便第一次调用将更新读数。
静态 int max6675_temp = (4*500); //!< 以摄氏度为单位的温度的四倍(每次计数 0.25 度)

/*!
使用 SPI 总线读取 MAX6675 热电偶。

MAX6675 执行冷端补偿并将来自 K 型热电偶的信号数字化。
数据以 12 位分辨率、SPI™ 兼容的只读格式输出。
该转换器可将温度解析为 0.25°C,允许读数高达 +1024°C,并在 0°C 至 +700°C 的温度范围内表现出 8LSB 的热电偶精度。

这个函数由定时器 isr 每 8 毫秒调用一次。

相关的 MAX6675 时序:
CSB 下降到 SCK 上升 tCSS CL = 10pF 100 ns 最小值。
CSB 下降到输出启用 tDV CL = 10pF 100 ns 最大值。
CSB 上升到输出禁用 tTR CL = 10pF 100 ns
SCK 下降到输出数据有效 tDO CL = 10pF 100 ns
/
int read_max6675()
{
/

查看是否到了更新温度读数的时间。
/
if (millis() – max6675_previous_millis < HEAT_INTERVAL)
{
return(max6675_temp); // 不要改变这个值。回来就好。
}else
{ /

是时候阅读了。
重置 previous_millis。
/
max6675_previous_millis = millis();
}
/

必须将 Power Reduction SPI 位 PRSPI 写入零才能启用 SPI 模块。
*/
#ifdef PRR
PRR &= ~(1<<PRSPI);
#elif 定义 PRR0
PRR0 &= ~(1<<PRSPI);
#万一

/*
初始化
/
SPCR = (1<<MSTR) | (1<<SPE) | (1<<SPR0);
/

SPI 主机在拉低所需从机的从机选择 SS 引脚时启动通信周期。
/
写(MAX6675_SS,0);// 使能 TT_MAX6675 从机选择。
#if (0)
/

我在运行 1Mhz SPI 的 16Mhz Mega 上测量了 SS 和 SCLK 之间 610usec 的延迟,没有任何延迟。
不需要延迟,在中断中添加不必要的延迟是不可原谅的。
/
延迟微秒(1);// 在时钟开始之前从选择后确保 100ns 延迟。
#endif
/

MAX 的第一位在从选择变低和时钟启动的 100 纳秒内可用。
所有位都将在 16*sclk+100nsec 内计时。
SPI 系统在接收方向采用双缓冲。
这意味着必须在下一个字符完全移入之前从 SPI 数据寄存器 (SPDR) 读取第一个字符。
否则,第一个字节将丢失。
*/
// 读取 MSB。
SPDR = 0; // 启动 SPI 时钟发生器。
对于 (;(SPSR & (1<<SPIF)) == 0;);
max6675_temp = SPDR<<8;

// 读取 LSB,我们不需要读取 SPDR。
SPDR = 0;
对于 (;(SPSR & (1<<SPIF)) == 0;);
max6675_temp |= SPDR;

写(MAX6675_SS,1);// 禁用 TT_MAX6675 从机选择。
/*
MAX6675 在从机选择变高后的 100 纳秒内离开 SPI 总线。
*/

/*
如果 MAX6675 未连接,它可以输入所有时钟(MISO 高)。
检查高位和设备存在位是否为零,表明 MAX6675 存在。
/
if (0 == (max6675_temp & 0x8002))
{ /

检查热电偶开路条件。
位 D2 通常为低电平,如果热电偶输入打开则变为高电平。
为了允许开路热电偶检测器运行,T-必须接地。
/
if (max6675_temp & 4)
{
max6675_temp = 2000; // 热电偶打开
}else
{ /

底部三位是打开指示器、设备 ID、三个状态位。
将这些位移出返回值。
/
max6675_temp >>=3;
}
}else
{ /

我们没有从 MAX6675 获得有效读数。
*/
max6675_temp = 2000; // MAX6675 不存在。
}
返回(max6675_temp);
} // read_max6675()。

万一