MAX31865模块和PT100实现温度测量使用配置笔记教程
0、前言
最初接触这个MAX31865模块,还是研究生同学请教我一个问题,他跟我说这个PT100、PT1000温度传感器模块,无论怎么调,都弄不出来,网上的工程代码找了一个又一个,就是不成功。
然后简单网上了解了一下后,发现没啥难的啊,不就是一个SPI协议写一写指令,通信驱动一下就可以用了吗?
必须搞起来,然而打脸来的很快很快,我拿到同学给的几个模块后,我无论怎么写都没有成功,一度开始自我怀疑自己代码是不是有Bug,对写的代码反复反复的检查了好几回,没有发现任何问题啊,到底为什么???要是弄不出来,那不是很尴尬,让我的能力被严重的质疑?
修改代码解决不了问题后,我开始怀疑这批传感器模块有问题,因此用示波器和逻辑分析仪对SPI的波形进行解析,都只有发给模块的信号,但是没有返回数据波形。
换了一个厂家的模块后,果然,是店家的硬件产品有质量问题,换一个店家模块后,原来一样的程序代码可以正常跑了。
因为一个模块质量问题,白白emo了好几天,必须记录一下,记住这沉重的经历,提醒今后在项目研发中,同样关注硬件设备是否正常?
1、什么是MAX31865
对于温度模块,在接触单片机开发的时候,或多或少都是有了解到的,比如大多数供学习用的开发板就会集成DS18B20这个温湿度模块,还有DH11。
但对于MAX31865这个模块,如果不是特殊的业务项目场景需要,可能就会接触的比较少了。因为前面的DS18B20和DH11已经可以满足绝大多数的普通单片机学习使用了。
MAX31865也是一个用于测温的模块,通常配合PT100、PT1000一起使用,非常好的一个特性就是防水,可测量的温度范围值比其它模块的更大。
用厂家的话来说就是,MAX31865是一款易于使用的电阻-数字转换器,针对铂电阻温度检测器(RTD)进行了优化。MAX31865这个传感器模块目前已经广泛应用在工业设备,医疗设备,和仪器仪表中。
关于MAX31865这个传感器芯片的介绍,在网上已经有很多了,因此在这里就不过度描述。
2、MAX31865资料手册阅读
在帮助同学或者网友解决问题时,和他们沟通交流得知,很多处于起步的阶段的同学,是还不会阅读资料手册,或者说,看到资料手册,不知道应该怎么阅读,根本就是一个无从下手的状态。因此在这个部分,主要是手把手的带领阅读资料手册。
在拿到一个芯片资料手册时,我们需要明白,产商给的技术手册,里面内容是非常多的,主要目的是为了面向的不同的群体,如电子工程师,嵌入式软件工程师、技术支持工程师等。因此,不同工作群体的关注点的内容是不一样的。我们需要根据实际需要进行针对性的快速阅读,本文主要是面向编写程序代码软件实现对MAX31865这个模块使用,因此更多需要关注的就是逻辑时序图、寄存器指令地址和数据格式解析转换等内容。
(1)、逻辑时序图阅读
①、时序图电气特性注释表
一般芯片手册的时序图前后,都会有一个这样的表格,说明了时序图中各个缩写的含义及每个数据的时序范围信息,供开发者在阅读逻辑时序图时不会云里雾里,能帮助开发者更好的阅读理解。
②、SPI读取数据传输
在下面的数据读取时序图中,SPI的片选引脚CS拉低电平,表示选中了这个SPI设备芯片。在完成数据信号传输后,CS引脚拉高。
时钟信号SCLK则在CS拉低后,开始产生改变高低电平,产生上升沿和下降沿,供SDI和SDO进行数据传输。
SDI则是根据信号SCLK的上升沿和下降沿的时间范围内,拉低、拉高SDI引脚,从而达到,发送0、1信号的目的。需要注意的是,SDI的时序图部分,有两条信号线,这表示的是,这个引脚,可以有两种情况,可以低电平开始,或者是以高电平开始。
SDO最开始的一段WRITE ADDRESS BYTE时间内是处于中间位置的,这表示的是,在这一时刻,SDO不需要进行操作,状态可以任意。在SDO的READ DATA BYTE这个时间范围,则是利用SCLK上升沿和下降沿进行接收高低电平数据。
除了对这些引脚的高低电平状态理解外,还需要留意时间间隔,必须严格遵守厂家的时间间隔要求,不然编写的程序代码可能不能正确的操作芯片。
③、SPI写数据传输
SPI写数据传输的逻辑时序图解析理解方法和SPI读取数据传输类似,这里不过多阐述。
(2)、寄存器地址
在MAX31865中,有8个读寄存器地址,5个写寄存器地址。分别是配置寄存器、RTD数据,故障阈值、错误状态信息寄存器对应的地址,具体描述,见下图所示。在后续的MAX31865的驱动及正常的温度解析代码中,只需要对这些寄存器地址的写入或读取数据,即可完成正常的测温功能。
(3)、温度数据转换
根据MAX31865官方技术文档的内容可知,对温度解析,可以采取计算法直接将温度进行解析计算,也可以采用查表的方式,如果采用查表法,则需要将MAX31865提供的表格也放到程序代码中。
使用PT100 RTD、400Ω高精度低漂移基准电阻的典型情况下,PT100、400Ω RREF的温度示例。
3、MAX31865通信代码示例
(1)、max31865.h
#ifndef __MAX31865_H
#define __MAX31865_H#include "stm32f4xx.h"
#include <stdio.h>
#include "delay.h"
#include "sys.h"#define MAX31865_SPI_CS PCout(13)#define MAX31865_SPIx SPI1
#define MAX31865_CS_Port GPIOC
#define MAX31865_CS_Pin GPIO_Pin_13
#define MAX31865_RDY_Port GPIOC
#define MAX31865_RDY_Pin GPIO_Pin_10#define RREF (400)
//PT100分度表里的最低温度
#define RTD_TABLE_TEMP_MIN -200
//PT100分度表里的最高温度
#define RTD_TABLE_TEMP_MAX 650void MAX31865_GPIO_Init(void);
void MAX31865_SB_Write(uint8_t addr, uint8_t wdata);
uint8_t MAX31865_SB_Read(uint8_t addr);void MAX31865_Init();
uint16_t MAX31865_Find_Index (double Rt);
double MAX31865_Conver_Temperature(double Rt);
float MAX31865_Get_Temperature(void);#endif
(2)、max31865.c
#include "max31865.h"
#include "index.h"/*** @brief MAX31865 GPIO初始化* @param None* @retval None*/
void MAX31865_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;/* 1. 使能 GPIO 和 SPI1 时钟 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/* 2. 配置 SCK (PA5), MISO (PB4), MOSI (PB5) 为复用推挽输出 */// PA5 - SCKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);// PB4 - MISOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_Init(GPIOB, &GPIO_InitStructure);// PB5 - MOSIGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_Init(GPIOB, &GPIO_InitStructure);// 设置引脚复用为 SPI1GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); // PA5 -> SPI1_SCKGPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1); // PB4 -> SPI1_MISOGPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1); // PB5 -> SPI1_MOSI/* 3. 配置 CS(片选)引脚 PC13 */GPIO_InitStructure.GPIO_Pin = MAX31865_CS_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(MAX31865_CS_Port, &GPIO_InitStructure);GPIO_SetBits(MAX31865_CS_Port, MAX31865_CS_Pin); // 默认高电平,不选中/* 4. 配置 RDY(就绪信号)引脚 PC10 */GPIO_InitStructure.GPIO_Pin = MAX31865_RDY_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(MAX31865_RDY_Port, &GPIO_InitStructure);/* 5. 复位 SPI1(可选) */RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);/* 6. 配置 SPI1 参数 */SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工模式SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主机模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8位数据长度SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // CPOL = 1(空闲为高)SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // CPHA = 1(第二个边沿采样)SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // 软件控制NSSSPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;// 分频系数128,约 84/128 ≈ 0.656 MHzSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // MSB在前SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC多项式(不启用)SPI_Init(SPI1, &SPI_InitStructure);/* 7. 启动 SPI1 */SPI_Cmd(SPI1, ENABLE);
}/*** @brief 向 MAX31865 寄存器写入一个字节* @param addr: 寄存器地址* @param wdata: 要写入的数据* @retval None*/
void MAX31865_SB_Write(uint8_t addr, uint8_t wdata)
{uint8_t Tx_Data[2];Tx_Data[0] = addr;Tx_Data[1] = wdata;MAX31865_SPI_CS = 0;// 发送第一个字节(地址)while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, addr);// 等待传输完成while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// 发送第二个字节(数据)SPI_I2S_SendData(SPI1, wdata);// 等待最后一个字节发送完成while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);MAX31865_SPI_CS = 1;
}/*** @brief 从 MAX31865 读取一个字节* @param addr: 寄存器地址* @retval 读取到的数据*/
uint8_t MAX31865_SB_Read(uint8_t addr)
{uint8_t Rx_Data;MAX31865_SPI_CS = 0;// 发送地址while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, addr);// 等待接收while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);Rx_Data = SPI_I2S_ReceiveData(SPI1);// 发送 dummy byte 获取数据SPI_I2S_SendData(SPI1, 0xFF);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);Rx_Data = SPI_I2S_ReceiveData(SPI1);MAX31865_SPI_CS = 1;return Rx_Data;
}/*** @brief MAX31865模块初始化配置* @param None* @retval None*/
void MAX31865_Init()
{MAX31865_GPIO_Init();MAX31865_SB_Write(0x80,0xC1);//二线、四线配置//MAX31865_SB_Write(0x80,0xD1);//三线配置delay_ms(100);printf("%02X\r\n", MAX31865_SB_Read(0x00));}/*** @brief 查找索引* @param Rt:温度值* @retval TableCount表中的位置下标*/
uint16_t MAX31865_Find_Index (double Rt)
{uint16_t i;uint16_t TableCount = sizeof(RTD_Table)/sizeof(RTD_Table[0]);for (i=0; i< TableCount; i++){if (RTD_Table[i] > Rt){return (i-1);}}return (TableCount);
}/*** @brief 通过电压查找分度表计算对应温度* @param Rt:温度值* @retval 温度值*/
double MAX31865_Conver_Temperature(double Rt)
{unsigned short Index;double temperature;if (Rt < RTD_Table[0]) // 电阻值小于表格最值低于量程下限。{return 0;}if (Rt > RTD_Table[849]) // 电阻值大于表格最大值,超出量程上限 。{return 0;} //查找当前电阻在分度表中的位置索引Index = MAX31865_Find_Index(Rt);temperature = (Rt - RTD_Table[Index]) / (RTD_Table[Index + 1]- RTD_Table[Index]) + Index + RTD_TABLE_TEMP_MIN;return temperature;
}/*** @brief 获取温度* @param None* @retval 温度值*/
float MAX31865_Get_Temperature(void)
{unsigned int Data;float Rt;float temperature;Data=MAX31865_SB_Read(0x01)<<8;Data|=MAX31865_SB_Read(0x02);Data>>=1; //去掉Fault位printf("Read=0x%02X\r\n",Data);Rt = (float)Data/32768.0f*RREF; //计算RTD电阻值printf("Rt=0x%.1f\r\n",Rt);//计算温度值temperature = MAX31865_Conver_Temperature(Rt); //查找分度表获取温度//temperature = (Rt-100.0f) / 0.385055f; //计算法计算温度printf("tempture: %f C\r\n", temperature); return temperature;
}
(3)、index.h
#ifndef __INDEX_H__
#define __INDEX_H__ //根据MAX31865的技术文档,使用PT100 RTD、400Ω高精度低漂移基准电阻的典型情况下,PT100、400Ω RREF的温度示例。const double RTD_Table[] = {
18.52 , 18.952 , 19.384 , 19.815 , 20.247 , 20.677 , 21.108 , 21.538 , 21.967 , 22.397 ,
22.825 , 23.254 , 23.682 , 24.11 , 24.538 , 24.965 , 25.392 , 25.819 , 26.245 , 26.671 ,
27.096 , 27.522 , 27.947 , 28.371 , 28.796 , 29.22 , 29.643 , 30.067 , 30.49 , 30.913 ,
31.335 , 31.757 , 32.179 , 32.601 , 33.022 , 33.443 , 33.864 , 34.284 , 34.704 , 35.124 ,
35.543 , 35.963 , 36.382 , 36.8 , 37.219 , 37.637 , 38.055 , 38.472 , 38.889 , 39.306 ,
39.723 , 40.14 , 40.556 , 40.972 , 41.388 , 41.803 , 42.218 , 42.633 , 43.048 , 43.462 ,
43.876 , 44.29 , 44.704 , 45.117 , 45.531 , 45.944 , 46.356 , 46.769 , 47.181 , 47.593 ,
48.005 , 48.416 , 48.828 , 49.239 , 49.649 , 50.06 , 50.47 , 50.881 , 51.291 , 51.7 ,
52.11 , 52.519 , 52.928 , 53.337 , 53.746 , 54.154 , 54.562 , 54.97 , 55.378 , 55.786 ,
56.193 , 56.6 , 57.007 , 57.414 , 57.821 , 58.227 , 58.633 , 59.039 , 59.445 , 59.85 ,
60.256 , 60.661 , 61.066 , 61.471 , 61.876 , 62.28 , 62.684 , 63.088 , 63.492 , 63.896 ,
64.3 , 64.703 , 65.106 , 65.509 , 65.912 , 66.315 , 66.717 , 67.12 , 67.522 , 67.924 ,
68.325 , 68.727 , 69.129 , 69.53 , 69.931 , 70.332 , 70.733 , 71.134 , 71.534 , 71.934 ,
72.335 , 72.735 , 73.134 , 73.534 , 73.934 , 74.333 , 74.732 , 75.131 , 75.53 , 75.929 ,
76.328 , 76.726 , 77.125 , 77.523 , 77.921 , 78.319 , 78.717 , 79.114 , 79.512 , 79.909 ,
80.306 , 80.703 , 81.1 , 81.497 , 81.894 , 82.29 , 82.687 , 83.083 , 83.479 , 83.875 ,
84.271 , 84.666 , 85.062 , 85.457 , 85.853 , 86.248 , 86.643 , 87.038 , 87.432 , 87.827 ,
88.222 , 88.616 , 89.01 , 89.404 , 89.798 , 90.192 , 90.586 , 90.98 , 91.373 , 91.767 ,
92.16 , 92.553 , 92.946 , 93.339 , 93.732 , 94.124 , 94.517 , 94.909 , 95.302 , 95.694 ,
96.086 , 96.478 , 96.87 , 97.261 , 97.653 , 98.044 , 98.436 , 98.827 , 99.218 , 99.609 ,
100 , 100.391 , 100.781 , 101.172 , 101.562 , 101.953 , 102.343 , 102.733 , 103.123 , 103.513 ,
103.903 , 104.292 , 104.682 , 105.071 , 105.46 , 105.849 , 106.238 , 106.627 , 107.016 , 107.405 ,
107.794 , 108.182 , 108.57 , 108.959 , 109.347 , 109.735 , 110.123 , 110.51 , 110.898 , 111.286 ,
111.673 , 112.06 , 112.447 , 112.835 , 113.221 , 113.608 , 113.995 , 114.382 , 114.768 , 115.155 ,
115.541 , 115.927 , 116.313 , 116.699 , 117.085 , 117.47 , 117.856 , 118.241 , 118.627 , 119.012 ,
119.397 , 119.782 , 120.167 , 120.552 , 120.936 , 121.321 , 121.705 , 122.09 , 122.474 , 122.858 ,
123.242 , 123.626 , 124.009 , 124.393 , 124.777 , 125.16 , 125.543 , 125.926 , 126.309 , 126.692 ,
127.075 , 127.458 , 127.84 , 128.223 , 128.605 , 128.987 , 129.37 , 129.752 , 130.133 , 130.515 ,
130.897 , 131.278 , 131.66 , 132.041 , 132.422 , 132.803 , 133.184 , 133.565 , 133.946 , 134.326 ,
134.707 , 135.087 , 135.468 , 135.848 , 136.228 , 136.608 , 136.987 , 137.367 , 137.747 , 138.126 ,
138.506 , 138.885 , 139.264 , 139.643 , 140.022 , 140.4 , 140.779 , 141.158 , 141.536 , 141.914 ,
142.293 , 142.671 , 143.049 , 143.426 , 143.804 , 144.182 , 144.559 , 144.937 , 145.314 , 145.691 ,
146.068 , 146.445 , 146.822 , 147.198 , 147.575 , 147.951 , 148.328 , 148.704 , 149.08 , 149.456 ,
149.832 , 150.208 , 150.583 , 150.959 , 151.334 , 151.71 , 152.085 , 152.46 , 152.835 , 153.21 ,
153.584 , 153.959 , 154.333 , 154.708 , 155.082 , 155.456 , 155.83 , 156.204 , 156.578 , 156.952 ,
157.325 , 157.699 , 158.072 , 158.445 , 158.818 , 159.191 , 159.564 , 159.937 , 160.309 , 160.682 ,
161.054 , 161.427 , 161.799 , 162.171 , 162.543 , 162.915 , 163.286 , 163.658 , 164.03 , 164.401 ,
164.772 , 165.143 , 165.514 , 165.885 , 166.256 , 166.627 , 166.997 , 167.368 , 167.738 , 168.108 ,
168.478 , 168.848 , 169.218 , 169.588 , 169.958 , 170.327 , 170.696 , 171.066 , 171.435 , 171.804 ,
172.173 , 172.542 , 172.91 , 173.279 , 173.648 , 174.016 , 174.384 , 174.752 , 175.12 , 175.488 ,
175.856 , 176.224 , 176.591 , 176.959 , 177.326 , 177.693 , 178.06 , 178.427 , 178.794 , 179.161 ,
179.528 , 179.894 , 180.26 , 180.627 , 180.993 , 181.359 , 181.725 , 182.091 , 182.456 , 182.822 ,
183.188 , 183.553 , 183.918 , 184.283 , 184.648 , 185.013 , 185.378 , 185.743 , 186.107 , 186.472 ,
186.836 , 187.2 , 187.564 , 187.928 , 188.292 , 188.656 , 189.019 , 189.383 , 189.746 , 190.11 ,
190.473 , 190.836 , 191.199 , 191.562 , 191.924 , 192.287 , 192.649 , 193.012 , 193.374 , 193.736 ,
194.098 , 194.46 , 194.822 , 195.183 , 195.545 , 195.906 , 196.268 , 196.629 , 196.99 , 197.351 ,
197.712 , 198.073 , 198.433 , 198.794 , 199.154 , 199.514 , 199.875 , 200.235 , 200.595 , 200.954 ,
201.314 , 201.674 , 202.033 , 202.393 , 202.752 , 203.111 , 203.47 , 203.829 , 204.188 , 204.546 ,
204.905 , 205.263 , 205.622 , 205.98 , 206.338 , 206.696 , 207.054 , 207.411 , 207.769 , 208.127 ,
208.484 , 208.841 , 209.198 , 209.555 , 209.912 , 210.269 , 210.626 , 210.982 , 211.339 , 211.695 ,
212.052 , 212.408 , 212.764 , 213.12 , 213.475 , 213.831 , 214.187 , 214.542 , 214.897 , 215.252 ,
215.608 , 215.962 , 216.317 , 216.672 , 217.027 , 217.381 , 217.736 , 218.09 , 218.444 , 218.798 ,
219.152 , 219.506 , 219.86 , 220.213 , 220.567 , 220.92 , 221.273 , 221.626 , 221.979 , 222.332 ,
222.685 , 223.038 , 223.39 , 223.743 , 224.095 , 224.447 , 224.799 , 225.151 , 225.503 , 225.855 ,
226.206 , 226.558 , 226.909 , 227.26 , 227.612 , 227.963 , 228.314 , 228.664 , 229.015 , 229.366 ,
229.716 , 230.066 , 230.417 , 230.767 , 231.117 , 231.467 , 231.816 , 232.166 , 232.516 , 232.865 ,
233.214 , 233.564 , 233.913 , 234.262 , 234.61 , 234.959 , 235.308 , 235.656 , 236.005 , 236.353 ,
236.701 , 237.049 , 237.397 , 237.745 , 238.093 , 238.44 , 238.788 , 239.135 , 239.482 , 239.829 ,
240.176 , 240.523 , 240.87 , 241.217 , 241.563 , 241.91 , 242.256 , 242.602 , 242.948 , 243.294 ,
243.64 , 243.986 , 244.331 , 244.677 , 245.022 , 245.367 , 245.713 , 246.058 , 246.403 , 246.747 ,
247.092 , 247.437 , 247.781 , 248.125 , 248.47 , 248.814 , 249.158 , 249.502 , 249.845 , 250.189 ,
250.533 , 250.876 , 251.219 , 251.562 , 251.906 , 252.248 , 252.591 , 252.934 , 253.277 , 253.619 ,
253.962 , 254.304 , 254.646 , 254.988 , 255.33 , 255.672 , 256.013 , 256.355 , 256.696 , 257.038 ,
257.379 , 257.72 , 258.061 , 258.402 , 258.743 , 259.083 , 259.424 , 259.764 , 260.105 , 260.445 ,
260.785 , 261.125 , 261.465 , 261.804 , 262.144 , 262.483 , 262.823 , 263.162 , 263.501 , 263.84 ,
264.179 , 264.518 , 264.857 , 265.195 , 265.534 , 265.872 , 266.21 , 266.548 , 266.886 , 267.224 ,
267.562 , 267.9 , 268.237 , 268.574 , 268.912 , 269.249 , 269.586 , 269.923 , 270.26 , 270.597 ,
270.933 , 271.27 , 271.606 , 271.942 , 272.278 , 272.614 , 272.95 , 273.286 , 273.622 , 273.957 ,
274.293 , 274.628 , 274.963 , 275.298 , 275.633 , 275.968 , 276.303 , 276.638 , 276.972 , 277.307 ,
277.641 , 277.975 , 278.309 , 278.643 , 278.977 , 279.311 , 279.644 , 279.978 , 280.311 , 280.644 ,
280.978 , 281.311 , 281.643 , 281.976 , 282.309 , 282.641 , 282.974 , 283.306 , 283.638 , 283.971 ,
284.303 , 284.634 , 284.966 , 285.298 , 285.629 , 285.961 , 286.292 , 286.623 , 286.954 , 287.285 ,
287.616 , 287.947 , 288.277 , 288.608 , 288.938 , 289.268 , 289.599 , 289.929 , 290.258 , 290.588 ,
290.918 , 291.247 , 291.577 , 291.906 , 292.235 , 292.565 , 292.894 , 293.222 , 293.551 , 293.88 ,
294.208 , 294.537 , 294.865 , 295.193 , 295.521 , 295.849 , 296.177 , 296.505 , 296.832 , 297.16 ,
297.487 , 297.814 , 298.142 , 298.469 , 298.795 , 299.122 , 299.449 , 299.775 , 300.102 , 300.428 ,
300.754 , 301.08 , 301.406 , 301.732 , 302.058 , 302.384 , 302.709 , 303.035 , 303.36 , 303.685 ,
304.01 , 304.335 , 304.66 , 304.985 , 305.309 , 305.634 , 305.958 , 306.282 , 306.606 , 306.93 ,
307.254 , 307.578 , 307.902 , 308.225 , 308.549 , 308.872 , 309.195 , 309.518 , 309.841 , 310.164 ,
310.487 , 310.81 , 311.132 , 311.454 , 311.777 , 312.099 , 312.421 , 312.743 , 313.065 , 313.386 ,
313.708 , 314.029 , 314.351 , 314.672 , 314.993 , 315.314 , 315.635 , 315.956 , 316.277 , 316.597 ,
316.918 , 317.238 , 317.558 , 317.878 , 318.198 , 318.518 , 318.838 , 319.157 , 319.477 , 319.796 ,
320.116 , 320.435 , 320.754 , 321.073 , 321.391 , 321.71 , 322.029 , 322.347 , 322.666 , 322.984 ,
323.302 , 323.62 , 323.938 , 324.256 , 324.573 , 324.891 , 325.208 , 325.526 , 325.843 , 326.16 ,
326.477 , 326.794 , 327.11 , 327.427 , 327.744 , 328.06 , 328.376 , 328.692 , 329.008 , 329.324 ,};#endif /* __INDEX_H__ */