基于CC1310的低功耗无线测温系统设计

基于TI CC1310低功耗射频单片机的无线测温系统设计方案

系统架构

硬件设计

主要组件

  1. CC1310F128RGZ - 主控芯片
  2. TMP117 - 高精度数字温度传感器 (±0.1°C)
  3. CR2032 - 3V纽扣电池
  4. PCB天线 - 2.4GHz集成天线
  5. 电源管理电路 - 低功耗LDO和开关

电路原理图关键部分

软件实现

开发环境

  • IDE: Code Composer Studio (CCS) v12+
  • SDK: SimpleLink CC13x0 SDK 4.20+
  • 协议: TI 15.4-Stack (Sub-1 GHz)

程序结构

主程序流程

#include <ti/drivers/rf/RF.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/I2C.h>
#include <ti/sysbios/knl/Clock.h>

// 温度传感器地址
#define TMP117_ADDR 0x48

// 射频配置
RF_Params rfParams;
RF_Object rfObject;
RF_Handle rfHandle;

// I2C配置
I2C_Handle i2cHandle;
I2C_Params i2cParams;

// 低功耗模式配置
PowerCC26XX_Config powerConfig = {
    .policyInitFxn = &PowerCC26XX_initPolicy,
    .policyFxn = &PowerCC26XX_sleepPolicy,
    .calibrateFxn = &PowerCC26XX_calibrate,
    .enablePolicy = true,
    .calibrateRCOSC_LF = true,
    .calibrateRCOSC_HF = true
};

void main(void) {
    // 初始化硬件
    Board_init();
    GPIO_init();
    I2C_init();
    RF_init();
    
    // 配置I2C
    I2C_Params_init(&i2cParams);
    i2cParams.bitRate = I2C_100kHz;
    i2cHandle = I2C_open(Board_I2C_TMP, &i2cParams);
    
    // 配置RF
    RF_Params_init(&rfParams);
    rfParams.nInactivityTimeout = RF_INACTIVITY_TIMEOUT_DISABLED;
    rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
    // 进入主循环
    while(1) {
        // 读取温度
        float temperature = read_temperature();
        
        // 无线发送数据
        send_temperature(temperature);
        
        // 进入低功耗模式 (10分钟)
        set_sleep_timer(600000); // 600秒
        Power_sleep(PowerCC26XX_STANDBY);
    }
}

float read_temperature(void) {
    uint8_t txBuffer[1] = {0x00}; // 温度寄存器地址
    uint8_t rxBuffer[2] = {0};
    
    I2C_Transaction i2cTransaction = {
        .writeBuf = txBuffer,
        .writeCount = 1,
        .readBuf = rxBuffer,
        .readCount = 2,
        .slaveAddress = TMP117_ADDR
    };
    
    if(I2C_transfer(i2cHandle, &i2cTransaction)) {
        int16_t tempRaw = (rxBuffer[0] << 8) | rxBuffer[1];
        return tempRaw * 0.0078125; // TMP117分辨率
    }
    return -999.9; // 错误值
}

void send_temperature(float temp) {
    uint8_t txBuffer[5];
    txBuffer[0] = 0xAA; // 帧头
    memcpy(&txBuffer[1], &temp, sizeof(float));
    
    RF_cmdPropTx.pktLen = 5;
    RF_cmdPropTx.pPkt = txBuffer;
    
    RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropTx, RF_PriorityNormal, NULL, 0);
    while(RF_cmdPropTx.status != RF_DoneOk); // 等待发送完成
}

void set_sleep_timer(uint32_t milliseconds) {
    Clock_Params clockParams;
    Clock_Params_init(&clockParams);
    clockParams.period = 0; // 单次触发
    clockParams.startFlag = false;
    
    Clock_Handle clockHandle = Clock_create(wakeupCallback, 
                                          milliseconds * 1000 / Clock_tickPeriod, 
                                          &clockParams, NULL);
    Clock_start(clockHandle);
}

void wakeupCallback(UArg arg) {
    // 唤醒后自动继续主循环
}

低功耗优化策略

功耗分析表

工作模式 电流消耗 持续时间 占总功耗比例
活动模式 5.4 mA 50 ms 0.45%
射频发送 14.2 mA 10 ms 0.23%
待机模式 1.3 μA 599.94 s 99.32%

平均电流计算:

(5.4mA * 0.05s) + (14.2mA * 0.01s) + (0.0013mA * 599.94s)
= 0.27 mAs + 0.142 mAs + 0.78 mAs
= 1.192 mAs / 600s = 0.001987 mA ≈ 1.99 μA

功耗优化技术

  1. 时钟门控:

    Power_setDependency(PowerCC26XX_PERIPH_GPIO); // 仅在使用时启用
    
  2. 外设智能管理:

    // 仅在需要时启用I2C
    I2C_close(i2cHandle); // 读取后立即关闭
    
  3. 射频快速启动:

    RF_Events_t events = RF_getEventMasks(rfHandle);
    if(events & RF_EventLastCmdDone) {
        RF_runImmediateCmd(rfHandle, (uint32_t*)&RF_cmdPropTx);
    }
    
  4. 自适应采样率:

    // 温度变化大时增加采样率
    if(fabs(currentTemp - lastTemp) > 1.0) {
        sleepTime = 30000; // 30秒
    } else {
        sleepTime = 600000; // 10分钟
    }
    

无线协议设计

数据帧格式

字节 内容 说明
0 0xAA 帧头
1-4 float 温度值 (IEEE 754)
5 CRC8 校验码

通信参数

// RF配置结构体
RF_PropRadioDivSetup RF_cmdPropRadioDivSetup = {
    .commandNo = 0x3807,
    .status = 0x0000,
    .pNextOp = 0,
    .startTime = 0,
    .startTrigger.triggerType = 0x0,
    .startTrigger.pastTrig = 0x0,
    .condition.rule = 0x1,
    .condition.nSkip = 0x0,
    .config.frontEndMode = 0x0,
    .config.biasMode = 0x1,
    .config.analogCfgMode = 0x0,
    .config.bNoFsPowerUp = 0x0,
    .txPower = 0x9320, // +14 dBm
    .pRegOverride = ieee_15_4_868MHz_div2,
    .centerFreq = 0x0364, // 868 MHz
    .intFreq = 0x8000,
    .loDivider = 0x05,
    .mode = 0x00,
};

PCB设计要点

  1. 天线设计:

    • 使用倒F天线(IFA)布局
    • 50Ω阻抗匹配网络
    • 天线净空区保持至少10mm
  2. 电源去耦:

    • 10μF钽电容 + 100nF陶瓷电容
    • 电源分区布局
  3. 热隔离:

    • 温度传感器远离MCU和射频部分
    • 使用热通孔隔离

测试与校准

温度校准程序

void calibrate_temperature_sensor(void) {
    // 三点校准法
    float cal_points[3] = {0.0, 25.0, 50.0}; // 温度点
    float measured[3];
    float cal_offset = 0;
    
    for(int i=0; i<3; i++) {
        set_reference_temperature(cal_points[i]); // 使用恒温槽
        measured[i] = read_temperature();
        cal_offset += (cal_points[i] - measured[i]);
    }
    
    cal_offset /= 3.0;
    save_calibration(cal_offset); // 保存到Flash
}

float get_calibrated_temp(void) {
    float raw = read_temperature();
    return raw + get_calibration_offset();
}

射频性能测试

  1. 使用频谱分析仪测量发射功率
  2. 使用网络分析仪检查天线匹配
  3. 在屏蔽室进行距离测试

系统部署

安装注意事项

  1. 传感器与测量表面良好接触
  2. 避免金属物体靠近天线
  3. 定期检查电池状态(每2年)

参考 该项目是 基于TI的CC1310低功耗射频单片机实现无线测温 www.youwenfan.com/contentcnl/56833.html,在采集仪端使用LCD屏显示终端节点的采集数据。

上位机软件示例(Python)

import serial
import struct
import matplotlib.pyplot as plt
from datetime import datetime

ser = serial.Serial('COM3', 115200, timeout=1)
temperatures = []
timestamps = []

try:
    while True:
        data = ser.read(6)
        if len(data) == 6 and data[0] == 0xAA:
            # 验证CRC
            if crc8(data[:5]) == data[5]:
                temp = struct.unpack('f', data[1:5])[0]
                temperatures.append(temp)
                timestamps.append(datetime.now())
                
                # 更新图表
                plt.clf()
                plt.plot(timestamps, temperatures, 'b-')
                plt.ylabel('Temperature (°C)')
                plt.title('Wireless Temperature Monitoring')
                plt.grid(True)
                plt.pause(0.05)
                
except KeyboardInterrupt:
    ser.close()
    plt.savefig('temperature_log.png')

def crc8(data):
    crc = 0
    for byte in data:
        crc ^= byte
        for _ in range(8):
            if crc & 0x80:
                crc = (crc << 1) ^ 0x07
            else:
                crc <<= 1
            crc &= 0xFF
    return crc

性能指标

  1. 测温范围: -40°C 到 +125°C
  2. 精度: ±0.2°C (校准后)
  3. 传输距离: 城市环境500m (868MHz), 开阔地1km
  4. 电池寿命: >5年 (CR2032, 10分钟采样)
  5. 无线速率: 50 kbps (GFSK调制)

故障排除

问题现象 可能原因 解决方案
无法启动 电池电压不足 更换电池
温度读数异常 传感器接触不良 检查传感器安装
通信距离短 天线匹配问题 重新调整天线匹配网络
电池消耗过快 MCU未进入睡眠 检查低功耗配置
数据包丢失率高 射频干扰 更改RF频道或增加重传机制

本设计充分利用了CC1310的低功耗特性和强大射频性能,实现了高精度、长寿命的无线温度监测系统。通过优化的硬件设计和软件策略,系统可在单颗纽扣电池供电下工作多年,适用于工业监控、冷链物流、环境监测等多种应用场景。

posted @ 2025-11-13 09:23  u95900090  阅读(12)  评论(0)    收藏  举报