找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2627|回复: 0
收起左侧

基于MSP430G2553的温度采集和控制系统设计资料

[复制链接]
ID:977412 发表于 2021-11-3 18:59 | 显示全部楼层 |阅读模式

完成的工作

我以选题二为任务目标
  • 经过自学,基本了解了MSP430G2553芯片的结构、外设模块,加上之前利用CCS软件给MSP430单片机烧制过程序,已基本了解CCS编程基本知识。
  • 掌握了利用AD软件绘制原理图的基本步骤,并能根据原理图绘制PCB图,其中的布局布线原则能好好遵守。
  • 制板到手后通过对贴片元器件的焊接,大大提高了焊接的能力,能保证不虚焊、焊反等问题并具有一定的美观性。
  • 通过查阅资料加上自己的改进完成了代码的调试,最后的温度采集和控制系统能实现利用OLED显示实时温度和供电电压,并能输出PWM波控制电机运转,温度越高PWM波占空比越高电机转得越快。
二、系统设计

2.1 硬件设计

2.1.1 硬件系统方案框图及介绍

包含六大模块,分别是:DS18B20,实现对温度的采集;

                     AMS1117,稳压芯片组成电源部分;

                      OLED,将采集的信息显示在屏幕上;

                     L9110S,驱动电机运转;

                     MAX3232,实现RS-232性能,搭配四个0.1uF的电容组成电池供电设备。

                     MSP430G2553,整个系统的CPU;

2.1.2MSP430G2553单片机的特点

? 低电源电压范围:1.8V 至 3.6V
? 超低功耗
– 运行模式:230μA(在 1MHz 频率和 2.2V 电压条件下)
– 待机模式:0.5μA
– 关闭模式(RAM 保持):0.1μA
? 5 种节能模式
? 可在不到 1μs 的时间里超快速地从待机模式唤醒
? 16 位精简指令集 (RISC) 架构,62.5ns 指令周期时间
? 基本时钟模块配置
– 具有四种校准频率并高达 16MHz 的内部频率
– 内部超低功耗低频 (LF) 振荡器
– 32kHz 晶振
– 外部数字时钟源
? 两个 16 位 Timer_A,分别具有三个捕获/比较寄存器
? 多达 24 个支持触摸感测的 I/O 引脚

2.1.3MSP430G2553单片机管脚作用

2.1.4原理图设计主要规范

1、元件编号以设计图为准,不要修改元件的原始编号
2、以设计模块为单元进行绘制,完整的单元模块内元件用导线连接
3、功能模块之间用网络标号连接
4、重要器件的管脚与PDF文档一致
5、特殊器件的原理图库制作要简洁且能说明问题
6、引出所需的各种接口如电源接口、测试接口、下载接口等,功能模块之间添加跳线为模块测试用
7、有极性区分的两引脚器件连接注意正负如极性电容、数码管(共阳共阴要实测)等,三引脚器件连接注意引脚功能排列顺序如电位器、三极管、集成稳压电源芯片等。
8、电阻、二极管等在原理图库中的符号直接修改成小一些的符号(以10mil为单位合理缩小)。
9、以A4大小绘图,尽量紧促
10、自制封装器件的单位用公制mm。
11、元件外围边框为元件焊接放置时的垂直投影
12、元件的丝印层不要覆盖至焊盘
13、焊盘孔径大小较管脚尺寸(方形引脚器件应测量对角尺寸)大0.2~0.3mm,具体值视具体器件而定,优先采用0.6mm、0.8mm、1.0mm、1.2mm等尺寸
14、焊盘的外径应为大于等于焊盘孔径的2倍
15、自制元件封装的命名:元件编号—安装方式(默认为立式安装可不做标注,卧式安装时标W)
16、常用元件可参考原库封装
17、特殊元件封装的参考点设置以PCB板的装配图尺寸标注的参考点为准
18、有极性区分的两引脚器件1脚为正,三引脚器件连接注意引脚排列与功能一致(尤其注意三极管的管脚与原理图及手册要对应)

2.1.5 系统原理图及各部分介绍

温度采集模块
供电模块
驱动电机模块
电池充电模块
系统CPU
OLED显示模块

2.1.6 PCB设计主要规范和PCB图

(1)不同电压等级电源应该隔离,电源走线不应交叉。
(2)走线采用 45°拐角或圆弧拐角,不允许有尖角形式的拐角。
(3)PCB走线直接连接到焊盘的中心,与焊盘连接的导线宽度不允许超过焊盘外径的大小。
(4)高频信号线的线宽不小于 20mil,外部用地线环绕,与其他地线隔离。
(5)干扰源(DC/DC 变换器、晶振、变压器等)底部不要布线,以免干扰。
(6)尽可能加粗电源线和地线,在空间允许的情况下,电源线的宽度不小于 50mil。
(7)低电压、低电流信号线宽 9~30mil,空间允许的情况下尽可能加粗。
(8)信号线之间的间距应该大于 10mil,电源线之间间距应该大于 20mil。
(9)大电流信号线线宽应该大于 40mil,间距应该大于 30mil。
(10)过孔最小尺寸优选外径 40mil,内径 28mil。在顶层和底层之间用导线连接时,优选焊盘。
(11)不允许在内电层上布置信号线。
(12)内电层不同区域之间的间隔宽度不小于 40mil。
(13)在绘制边界时,尽量不要让边界线通过所要连接到的区域的焊盘。
(14)在顶层和底层铺设敷铜,建议设置线宽值大于网格宽度,完全覆盖空余空间,且不留有死铜,同时与其他线路保持 30mil(0.762mm)以上间距(可以在敷铜前设置安全间距,敷铜完毕后改回原有安全间距值)。
(15)在布线完毕后对焊盘作泪滴处理。
(16)金属壳器件和模块外部接地。
(17)放置安装用和焊接用焊盘。
(18)DRC 检查无误。

2.1.7原理图和PCB设计软件

(1)原理图编译时,提示Net has no driving source

一是将对应元件的管脚类型修改为对应的类型;(如果是input、output等,表示进行电气规则检查,需要将相连接的关联元件的管脚类型都进行相应设置,比如:这儿5脚是input,则和它连接的部分可调整为output;如果是passive类型,则表示不需要进行电气规则检测。)

第二个方法是:点击“放置——指示——没有ERC”,这儿,没有ERC即表示不就行电气规则检查,然后,在告警的相应点处放置一个No ERC即可

(2)原理图编译时,提示Floating Net Label...at...

网络标号悬浮,没有连接

(3)画完原理图的时候一定要让所有的元件都有封装,否则导PCB的时候会找不到元件

(4)若发现图不正确,一定要先改原理图,再用原理图更PCB.

(5)PCB原件移动提示绿色报错问题
可能的原因:1、不符合DRC规则,比如原件之间距离过近
2、右下角ROOM没有删除

2.1.8 焊接电路板注意事项

1、选择合适的焊接温度

电烙铁的焊接温度过高或者过低,都容易造成焊接不良。

2、焊接元器件遵循从小到大的原则

焊接元器件要先焊接小,再焊接大。

3、注意极性反向

像一些电容、电阻、二极管和三极管,是有极性方向的,在焊接时要避免接反。

4、锡不易过多

焊接时要确保焊点的周围都有锡,防止虚焊,但并不是锡越多越好,当焊点的锡量层锥形即是最好的。电路板焊接时还要注意通风,可以选择配备一个抽风机,防止焊接时产生的气体吸入人体,对人体造成伤害。

2.2 软件设计

2.2.1 软件设计流程


测温函数
#ifndef __DS18B20_H
#define __DS18B20_H

#include<msp430g2553.h>

#define  DQ_OUT P2DIR|=BIT1
#define  DQ_IN  P2DIR&=~BIT1
#define  DQ_H   P2OUT|=BIT1
#define  DQ_L   P2OUT&=~BIT1
#define  DQ_READ  (P2IN&BIT1)

#define uchar unsigned char
#define uint  unsigned int

float readtemperature(void);



#endif  //__DS18B20_H

OLED显示函数
#ifndef __OLED_H
#define __OLED_H                                                         
#include    <msp430.h>
#include              <intrinsics.h>
#define  u8 unsigned char
#define  u32 unsigned int
#define OLED_CMD  0              //写命令
#define OLED_DATA 1              //写数据



#define                            Set_Bit(val, bitn)                            (val |= (/*1 <<*/(bitn)))                           
#define                            Clr_Bit(val, bitn)                            (val &= ~(/*1<<*/(bitn)))                           
#define                            Get_Bit(val, bitn)                            (val & (1<<(bitn)) )                           
//----------------------------------------------------------------------------------
//OLED SSD1306 SPI  时钟D0
//#define                            OLED_SSD1306_SCLK_DIR                                          (P1DIR)
//#define                            OLED_SSD1306_SCLK_OUT                                          (P1OUT)
#define                            OLED_SSD1306_SCLK_PIN_NUM                            (BIT7)

#define                            OLED_SSD1306_SCLK_IO_INIT                            (Set_Bit(P3DIR,OLED_SSD1306_SCLK_PIN_NUM))
#define                            OLED_SCLK_Set()                                                  (Set_Bit(P3OUT,OLED_SSD1306_SCLK_PIN_NUM))
#define                            OLED_SCLK_Clr()                                                        (Clr_Bit(P3OUT,OLED_SSD1306_SCLK_PIN_NUM))

//----------------------------------------------------------------------------------
//OLED SSD1306 SPI 数据D1
//#define                            OLED_SSD1306_SDIN_DIR                                          (P1DIR)
//#define                            OLED_SSD1306_SDIN_OUT                                          (P1OUT)
#define                            OLED_SSD1306_SDIN_PIN_NUM                            (BIT7)

#define                            OLED_SSD1306_SDIN_IO_INIT                            (Set_Bit(P1DIR,OLED_SSD1306_SDIN_PIN_NUM))
#define                            OLED_SDIN_Set()                                                        (Set_Bit(P1OUT,OLED_SSD1306_SDIN_PIN_NUM))
#define                            OLED_SDIN_Clr()                                                  (Clr_Bit(P1OUT,OLED_SSD1306_SDIN_PIN_NUM))

//----------------------------------------------------------------------------------
//OLED SSD1306 数据/命令DC
//#define                            OLED_SSD1306_DC_DIR                                                        (P1DIR)
//#define                            OLED_SSD1306_DC_OUT                                                        (P1OUT)
#define                            OLED_SSD1306_DC_PIN_NUM                                          (BIT5)

#define                            OLED_SSD1306_DC_IO_INIT                                          (Set_Bit(P2DIR,OLED_SSD1306_DC_PIN_NUM))
#define                            OLED_DC_Set()                                                        (Set_Bit(P2OUT,OLED_SSD1306_DC_PIN_NUM))
#define                            OLED_DC_Clr()                                                         (Clr_Bit(P2OUT,OLED_SSD1306_DC_PIN_NUM))

//----------------------------------------------------------------------------------
//OLED SSD1306 片选CS
//#define                            OLED_SSD1306_CE_DIR                                                        (P1DIR)
//#define                            OLED_SSD1306_CE_OUT                                                        (P1OUT)
#define                            OLED_SSD1306_CE_PIN_NUM                                          (BIT3)

#define                            OLED_SSD1306_CE_IO_INIT                                          (Set_Bit(P2DIR,OLED_SSD1306_CE_PIN_NUM))
#define                            OLED_CS_Set()                                                        (Set_Bit(P2OUT,OLED_SSD1306_CE_PIN_NUM))
#define                            OLED_CS_Clr()                                                        (Clr_Bit(P2OUT,OLED_SSD1306_CE_PIN_NUM))

//----------------------------------------------------------------------------------
//OLED SSD1306 复位/RES
//#define                            OLED_SSD1306_RST_DIR                                          (P1DIR)
//#define                            OLED_SSD1306_RST_OUT                                          (P1OUT)
#define                            OLED_SSD1306_RST_PIN_NUM                            (BIT4)

#define                            OLED_SSD1306_RST_IO_INIT                            (Set_Bit(P2DIR,OLED_SSD1306_RST_PIN_NUM))
#define                            OLED_RST_Set()                                                        (Set_Bit(P2OUT,OLED_SSD1306_RST_PIN_NUM))
#define                            OLED_RST_Clr()                                                        (Clr_Bit(P2OUT,OLED_SSD1306_RST_PIN_NUM))

#define SIZE 16
#define XLevelL                            0x02
#define XLevelH                            0x10
#define Max_Column              128
#define Max_Row                            64
#define              Brightness              0xFF
#define X_WIDTH               128
#define Y_WIDTH               64                                                                                                      
//-----------------OLED端口定义----------------                                                                          

void delay_ms(unsigned int ms);


                                

//OLED控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);                 
void OLED_Display_On(void);
void OLED_Display_Off(void);                                                                                                                                                     
void OLED_Init(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
void OLED_ShowChar(u8 x,u8 y,u8 chr);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2);
void OLED_ShowString(u8 x,u8 y, u8 *p);            
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_ShowCHinese(u8 x,u8 y,u8 no);
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
#endif

测电压函数
void ADC_unit()
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
    ADC10CTL1 |= CONSEQ_2; //单通道重复采样模式
    ADC10CTL0 |= SREF_1+REFON+REF2_5V;//选择内部参考源 2.5V,打开基准源
    ADC10CTL0 |= ADC10SHT_3+MSC; //过采样率设置为 64 个采样周期,打开 AD 转换
    ADC10CTL1|= ADC10SSEL_1+ADC10DIV_1+SHS_0; //ACLK2 分 频 为 采 样 时 钟 , 用ADC10SC 触发采集
    ADC10CTL1 |=INCH_3; //选择通道 A3
    ADC10CTL0 |= ADC10ON; //开启 ADC10
    ADC10AE0 |= BIT3; //开启外部通道 A3
}

void readvoltage()
{
    Voltage=0;
    int i=0;
    ADC10_Result=0;
    for(;i<20;i++)
    {
     ADC10CTL0 |=ENC+ADC10SC; //开始转换
     //while((ADC10CTL0 &ADC10IFG)==0); //等待 ADC10IFG 标志变高(转换完成)
     ADC10_Result+=ADC10MEM; //读取采样结果
     }
     ADC10_Result= ADC10_Result/20;
     Voltage=(ADC10_Result*2.5*4)/1023;
}

PWM波输出函数
void sys_Clock_Init() //时钟初始化为 1MHz;
{
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation */
}
void PMW_OUT_Init () //PWM 输出初始化
{
P3DIR |= BIT5;
P3SEL |= BIT5;
TA0CTL |= TASSEL_1+TACLR+MC_1;
TA0CCTL1 |= OUTMOD_7; //选择高电平模式的 PWM 输出
TA0CCR0=500; // TA1CCR0 写入 2000(1MHZ/2000)输出达到了 500HZ
}

2.2.2 程序编程的主要规范
1.程序起名望文知义;
2.变量、函数起名规范;
3.循环变量可以用i,j,k;
4.计数器、累加器,一定要先赋初值0,循环内部循环变量需要变化;
5.注释规范;
6.代码缩进对齐;
7.适当空行,将不同功能程序段分开,每段的最前头,有单独的注释;

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便保存): word文档.7z (987 KB, 下载次数: 28)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表