这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » TI » 【MSP焕新大作战】课程3任务3基于MSPM0的温度报警器开发

共2条 1/1 1 跳转至

【MSP焕新大作战】课程3任务3基于MSPM0的温度报警器开发

高工
2024-05-18 16:10:42     打赏

   MSPM0L1306 LaunchPad™开发套件是一个全面评估MSPM0L1306混合信号微控制器(MCU)的各种功能的套件。包括用于编程、调试和能量的板载调试探针微控制器平台,包括用于编程、调试和能量的板载调试探针测量。该板还具有板载按钮和LED,可为简单用户快速集成测量。该板还具有板载按钮和LED,可为简单用户快速集成接口、板载热敏电阻、光传感器和RGB LED。接口、板载热敏电阻、光传感器和RGB LED。

  混合信号微控制器(Mixed-Signal Microcontroller)与普通单片机略有差异。是一种集成了数字信号处理能力和模拟信号处理能力的微控制器。它不仅包含了传统的微处理器(CPU)、内存(RAM和Flash)、输入/输出接口(I/O)等数字电路,还集成了模数转换器(ADC)、数模转换器(DAC)、比较器、放大器、PWM(脉冲宽度调制)输出等模拟电路部件。这种设计使得混合信号微控制器特别适合于那些需要同时处理数字和模拟信号的应用场合,比如物联网(IoT)设备、消费电子、汽车电子、工业控制、医疗设备等领域。在这些应用中,它们可以用来采集来自传感器的模拟信号(如温度、压力、光线强度等),进行必要的信号调理和转换为数字信号,然后通过数字信号处理技术进行分析、控制,最后再根据处理结果输出控制信号给执行器或者转换为模拟信号驱动模拟电路。一些知名的半导体厂商,如Texas Instruments(德州仪器)都提供了广泛的混合信号微控制器产品线,以满足不同应用领域的需求。这些产品通常还会提供配套的开发工具和软件库,帮助工程师快速进行产品设计与开发。

开发板:

10.jpg

    MSPM0L134x 和 MSPM0L130x 微控制器 (MCU) 属于 MSP 高度集成的超低功耗 32 位 MSPM0 MCU 系列, 该系列基于增强型 Arm® Cortex®-M0+ 内核平台, 工作频率最高可达 32MHz。 这些低成本 MCU 提供高性能模拟外设集成, 支持 -40°C 至 125°C 的工作温度范围, 并在 1.62V 至 3.6V 的电源电压下运行。MSPM0L134x 和 MSPM0L130x 器件提供高达 64KB 的嵌入式闪存程序存储器和高达 4KB 的 SRAM。这些 MCU包含精度高达 ±1.2% 的高速片上振荡器, 无需外部晶体。 其他特性包括 3 通道 DMA、 16 位和 32 位 CRC 加速器, 以及各种高性能模拟外设, 例如一个具有可配置内部电压基准的 12 位 1.68MSPS ADC、 一个具有内置基准DAC 的高速比较器、 两个具有可编程增益的零漂移零交叉运算放大器、 一个通用放大器和一个片上温度传感器。这些器件还提供智能数字外设, 例如四个 16 位通用计时器、 一个窗口化看门狗计时器和各种通信外设( 包括两个UART、 一个 SPI 和两个 I2C) 。 这些通信外设为 LIN、 IrDA、 DALI、 Manchester、 Smart Card、 SMBus 和PMBus 提供协议支持。

    TI MSPM0 系列低功耗 MCU 包含具有不同模拟和数字集成度的器件, 可让客户找到满足其工程需求的 MCU。此架构结合了多种低功耗模式, 并经过优化, 可在便携式测量应用中延长电池寿命。MSPM0L134x 和 MSPM0L130x MCU 由广泛的硬件和软件生态系统提供支持, 随附参考设计和代码示例, 便于您快速开始设计。 开发套件包括可购买的 LaunchPad™ 开发套件和适用于目标插座板的设计文件。 TI 还提供免费的 MSP 软件开发套件 (SDK), 该套件在 TI Resource Explorer 中作为 Code Composer Studio™ IDE 桌面版和云版组件提供。 MSPM0 MCU 还通过 MSP Academy 提供广泛的在线配套资料、培训, 并通过 TI E2E™ 支持论坛提供在线支

功能方框图



12.jpg

CPUCPU 子系统 (MCPUSS) 上实现了 Arm Cortex-M0+ CPU、 指令预取和高速缓存、 系统计时器以及中断管理功能。 Arm Cortex-M0+ 是一款成本优化的 32 位 CPU, 可为嵌入式应用提供高性能和低功耗。该 CPU 子系统的主要特性包括:• Arm Cortex-M0+ CPU 支持 32kHz 至 32MHz 的时钟频率– 带有单周期 32×32 乘法指令的 ARMv6-M Thumb 指令集( 小端字节序)– 通过 Arm 单周期 IO 端口对 GPIO 寄存器进行单周期访问• 用于改进顺序代码执行的预取逻辑和具有 2 个 64 位高速缓存行的指令缓存• 具有 24 位递减计数器和自动重新加载功能的系统计时器 (SysTick)• 具有 4 个可编程优先级和尾链的嵌套矢量中断控制器 (NVIC)• 用于扩展总中断源的中断组, 具有用于实现低中断延迟的跳转索引 操作模式MSPM0L MCU 提供五种主要工作模式( 功耗模式), 可根据应用要求优化器件功耗。 这些模式按照功耗从高到低排列如下: 运行、睡眠、停止、 待机和关断。 CPU 会在运行模式中执行代码。 外设中断事件可将器件从睡眠、停止或待机模式唤醒至运行模式。 关断模式会完全禁用内部内核稳压器, 以更大限度地降低功耗, 并且只能通过

NRST、 SWD 或某些 IO 上的逻辑电平匹配来实现唤醒。运行、睡眠、 停止和待机模式还包括多个可配置的策略选项( 例如, RUN.x), 用于平衡性能与功耗。为了进一步平衡性能和功耗, MSPM0L 器件实现了两个电源域: PD1( 用于 CPU、 存储器和高性能外设) 和PD0( 用于低速、 低功耗外设) 。 在运行和睡眠模式下, PD1 始终通电, 但在所有其他模式下会禁用。 PD0 在运行、睡眠、停止和待机模式下始终通电。 PD1 和 PD0 在关断模式下都会禁用。

温度报警器实现原理

1,蜂鸣器实驱动电路:

 蜂鸣器分为有源和无源。这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。

13.jpg

2,为温度传感器有热敏电阻合芯片。现在用的DS18B20温度传感。单总线接口:只需要一条数据线即可完成数据的发送和接收,外加一条接地线和电源线。

温度范围:测量范围通常是-55°C 到 +125°C,具有较高的精度,在-10°C到+85°C范围内误差为±0.5°C。分辨率:可设置为9位到12位,对应的温度分辨率从0.5°C到0.0625°C。自带ROM:每个DS18B20都有一个独一无二的64位序列号,便于在单总线上挂接多个设备。

14.jpg


读取流程图:

16.jpg

TI ccs软件设计:

 csycfg配置

17.jpg

宏定义

#define POWER_STARTUP_DELAY                                                (16)



#define CPUCLK_FREQ                                                     32000000



/* Defines for TIMER_0 */
#define TIMER_0_INST                                                     (TIMG0)
#define TIMER_0_INST_IRQHandler                                 TIMG0_IRQHandler
#define TIMER_0_INST_INT_IRQN                                   (TIMG0_INT_IRQn)
#define TIMER_0_INST_LOAD_VALUE                                          (1874U)
/* Defines for TIMER_1 */
#define TIMER_1_INST                                                     (TIMG1)
#define TIMER_1_INST_IRQHandler                                 TIMG1_IRQHandler
#define TIMER_1_INST_INT_IRQN                                   (TIMG1_INT_IRQn)
#define TIMER_1_INST_LOAD_VALUE                                          (4999U)




/* Port definition for Pin Group PORT_TempSensor */
#define PORT_TempSensor_PORT                                             (GPIOA)

/* Defines for PIN_TempSensor: GPIOA.23 with pinCMx 24 on package pin 27 */
#define PORT_TempSensor_PIN_TempSensor_PIN                      (DL_GPIO_PIN_23)
#define PORT_TempSensor_PIN_TempSensor_IOMUX                     (IOMUX_PINCM24)
/* Port definition for Pin Group PORT_LED_Red */
#define PORT_LED_Red_PORT                                                (GPIOA)

/* Defines for PIN_LED_Red: GPIOA.0 with pinCMx 1 on package pin 1 */
#define PORT_LED_Red_PIN_LED_Red_PIN                             (DL_GPIO_PIN_0)
#define PORT_LED_Red_PIN_LED_Red_IOMUX                            (IOMUX_PINCM1)
/* Port definition for Pin Group PORT_BEEP */
#define PORT_BEEP_PORT                                                   (GPIOA)

/* Defines for PIN__BEEP: GPIOA.12 with pinCMx 13 on package pin 16 */
#define PORT_BEEP_PIN__BEEP_PIN                                 (DL_GPIO_PIN_12)
#define PORT_BEEP_PIN__BEEP_IOMUX                                (IOMUX_PINCM13)
/* Port definition for Pin Group PORT_HC595 */
#define PORT_HC595_PORT                                                  (GPIOA)

/* Defines for PIN_HC595_DIO: GPIOA.3 with pinCMx 4 on package pin 7 */
#define PORT_HC595_PIN_HC595_DIO_PIN                             (DL_GPIO_PIN_3)
#define PORT_HC595_PIN_HC595_DIO_IOMUX                            (IOMUX_PINCM4)
/* Defines for PIN_HC595_SCLK: GPIOA.4 with pinCMx 5 on package pin 8 */
#define PORT_HC595_PIN_HC595_SCLK_PIN                            (DL_GPIO_PIN_4)
#define PORT_HC595_PIN_HC595_SCLK_IOMUX                           (IOMUX_PINCM5)
/* Defines for PIN_HC595_RCLK: GPIOA.5 with pinCMx 6 on package pin 9 */
#define PORT_HC595_PIN_HC595_RCLK_PIN                            (DL_GPIO_PIN_5)
#define PORT_HC595_PIN_HC595_RCLK_IOMUX                           (IOMUX_PINCM6)

温度读取函数

 */
void DS18B20_OneWireRisingEdge_Config(GPIO_Regs* PORTx,uint32_t PINx,uint32_t t1,uint32_t t2){
        DL_GPIO_clearPins(PORTx, PINx);
        delay_cycles(delay_us*t1);
        DL_GPIO_setPins(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
        delay_cycles(delay_us*t2);
}
/**
 *  @brief      单总线配置为输入模式
 *
 *  @param[in]  None
 *
 */
void DS18B20_DQ_IN(){           //配置通信引脚为输入模式
        DL_GPIO_disableOutput(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
        DL_GPIO_initDigitalInput(PORT_TempSensor_PIN_TempSensor_IOMUX);
        DL_GPIO_setPins(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
        DL_GPIO_enableOutput(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
}
/**
 *  @brief      单总线配置为输出模式
 *
 *  @param[in]  None
 *
 */
void DS18B20_DQ_OUT(){          //配置通信引脚为输出模式
        DL_GPIO_disableOutput(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
        DL_GPIO_initDigitalOutput(PORT_TempSensor_PIN_TempSensor_IOMUX);
        DL_GPIO_setPins(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
        DL_GPIO_enableOutput(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN);
}
/**
 *  @brief      复位DS18B20
 *
 *  @param[in]  None
 *
 */
void DS18B20_RESET(){
        DS18B20_DQ_OUT();
        DS18B20_OneWireRisingEdge_Config(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN,750,60);
}
/**
 *  @brief      判断DS18B20是否存在
 *
 *  @param[in]  None
 *
 */
uint8_t DS18B20_CHECK(){
        uint8_t counters=0;
        DS18B20_DQ_IN();
        while(DS18B20_DQ_IN_Read()&&counters<200){
            counters++;
            delay_cycles(delay_us*1);
        }
        if(counters>100)        //超时未检测到器件,返回1
            return 1;
        else
            counters=0;
        while(!(DS18B20_DQ_IN_Read())&&counters<240){
            counters++;
            delay_cycles(delay_us*1);
        }

        if(counters>240)        //检测到器件但总线电平持续拉低,返回2
            return 2;
        else
    //        DL_UART_transmitData(UART_0_INST,counters);
            return 0;           //检测到器件且总线电平有效,返回0
}
/**
 *  @brief      向DS18B20写入字节数据
 *
 *  @param[in]  data字节数据
 *
 */
void DS18B20_WRITE_Byte(uint8_t data){
        uint8_t byte=data;
        DS18B20_DQ_OUT();
        for(uint8_t i=1;i<=8;i++){
            if(byte&0x01){
                DS18B20_OneWireRisingEdge_Config(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN,2,60);
            }
            else{
                DS18B20_OneWireRisingEdge_Config(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN,60,2);
            }
            byte=byte>>1;
        }
}
/**
 *  @brief      从DS18B20读取比特数据
 *
 *  @param[in]  None
 *
 */
uint8_t DS18B20_READ_Bit(){
        uint8_t bit;
        DS18B20_DQ_OUT();
        DS18B20_OneWireRisingEdge_Config(PORT_TempSensor_PORT, PORT_TempSensor_PIN_TempSensor_PIN,2,5);
        DS18B20_DQ_IN();
        delay_cycles(delay_us*12);
        if(DS18B20_DQ_IN_Read())
            bit=1;
        else
            bit=0;
        delay_cycles(delay_us*50);
        return bit;
}
/**
 *  @brief      从DS18B20读取字节数据
 *
 *  @param[in]  None
 *
 */
uint8_t DS18B20_READ_Byte(){
        uint8_t bit=0;
        uint8_t byte=0;
        for(uint8_t i=1;i<=8;i++){
            bit=DS18B20_READ_Bit();
            byte|=bit<<(i-1);
        }
        return byte;
}
/**
 *  @brief      启用DS18B20
 *
 *  @param[in]  None
 *
 */
void DS18B20_START(void){
        DS18B20_RESET();
        DS18B20_CHECK();
        DS18B20_WRITE_Byte(0xcc);
        DS18B20_WRITE_Byte(0x44);
        DS18B20_RESET();
        DS18B20_CHECK();
        DS18B20_WRITE_Byte(0xcc);
        DS18B20_WRITE_Byte(0xbe);
}
/**
 *  @brief      初始化DS18B20
 *
 *  @param[in]  None
 *
 */
uint8_t DS18B20_INIT(void){
        DS18B20_RESET();
        return DS18B20_CHECK();
}
/**
 *  @brief      获取DS18B20温度数据(小数点数据)
 *
 *  @param[in]  None
 *
 */
float DS18B20_GetTemp(void){
        float temp_value=0.0;
        uint8_t temp_msb,temp_lsb=0;
        uint16_t temp=0;

        DS18B20_START();                //采样温度值
        temp_lsb=DS18B20_READ_Byte();
        temp_msb=DS18B20_READ_Byte();
        temp=(temp_msb<<8)+temp_lsb;
        if((temp&0xF800)==0xF800){      //高5位为1表示负温度
            temp=(~temp)+1;             //将补码取反运算+1得到负温值
            temp_value=temp*(-0.0625);
        }
        else
            temp_value=temp*0.0625;
        return temp_value;
}

    报警函数,蜂鸣器函数

 if(DS18B20_INIT()==0){
        temp=DS18B20_GetTemp();
        if(temp<temp_level[0]){
            DL_GPIO_setPins(PORT_BEEP_PORT,PORT_BEEP_PIN__BEEP_PIN);
        }
        else if(temp>=temp_level[0]&&temp<temp_level[1]){
            DL_GPIO_togglePins(PORT_BEEP_PORT,PORT_BEEP_PIN__BEEP_PIN);
        }
        else {
            DL_GPIO_clearPins(PORT_BEEP_PORT,PORT_BEEP_PIN__BEEP_PIN);
        }
    }
    else{
        temp=0.1000;
        DL_GPIO_setPins(PORT_BEEP_PORT,PORT_BEEP_PIN__BEEP_PIN);
        delay_cycles(delay_us*1000);//温度传感器不存在、异常,LED_Red不断闪烁
        DL_GPIO_togglePins(PORT_LED_Red_PORT,PORT_LED_Red_PIN_LED_Red_PIN);
    }


18.jpg

完整版程序参考:

https://download.csdn.net/download/gaoqingmameng123456/89323471?spm=1001.2014.3001.5501











高工
2024-05-18 16:29:52     打赏
2楼
任务3视频链接:

现在用的DS18B20温度传感。单总线接口:只需要一条数据线即可完成数据的发送和接收,外加一条接地线和电源线。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]