单片机部分

Download Report

Transcript 单片机部分

MSP340 LaunchPad介绍
LaunchPad 是一款
适用于TI的
MSP430G2xx 系列
产品的完整开发解
决方案,可支持多
达20 个引脚,提供
板上Flash 仿真工
具,以直接连接至
PC 轻松进行编程、
调试和评估。
目录
一、基本时钟系统
二、通用IO
三、中断
四、定时器
五、ADC10
六、课程软件任务介绍
一、时钟系统
LAUNCHPAD时钟系统包括:VLO、LFXT、DCO
• 超低功耗/低频振荡器 (VLO)
– 4 – 20kHz (典型值12kHz)
– 500nA 待机流耗
– 0.5%/°C and 4%/V 漂移
• 外接晶体振荡器(LFXT1)
– 片内可编程负载电容
– 故障保护 OSC_Fault
– 脉冲滤波器
• 数字控制振荡器(DCO)
– 0-to-16MHz
– + 3% 容差
– 出厂校准(Flash I.M.)
VLO
Min. Puls
Filter
ACLK
Peripherals
辅助时钟
32768Hz
OSC_Fault
MCLK
CPU
主系统时钟
16MHz
DCO
SMCLK
Peripherals
子系统时钟
上电后:
MCLK 和 SMCLK 由DCOCLK 提
供(约1.1 MHz)
ACLK 由 LFXT1CLK 提供(LF
模式,6pF内部负载电容)
设置时钟涉及到寄存器BCSCTL1、BCSCTL2的设置,具
体见用户说明说,下面举例设置DOC为1MHz及系统主时
钟MCLK。
// 设置DCO为1MHz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL
= CALDCO_1MHZ;
// 设定 MCLK
BCSCTL2 |= SELM_1
+ DIVM_3; // 设置 MCLK
对MCLK的时钟源进行选择
SELM_0: MCLK选择DCOCLK
对MCLK,即指令运行的时钟源进行分频
SELM_1 : MCLK选择DCOCLK
DIVM_1: MCLK=1M/2
SELM_2 : MCLK选择XT2CLK/LFXTCLK
DIVM_2: MCLK=1M/4
SELM_3: MCLK选择LFXTCLK
DIVM_3: MCLK=1M/8
DIVM_0: MCLK=1M
二、通用IO
1、P口端口寄存器:
(1)、PxDIR 输入/输出方向寄存器
(0:输入模式 1:输出模式)
(2)、PxIN 输入寄存器
输入寄存器是只读寄存器,用户不能对其写入,只能通过读取该寄存器的
内容知道I/O口的输入信号。
(3)、PxOUT 输出寄存器
寄存器内的内容不会受引脚方向改变的影响。
(4)、PxIFG 中断标志寄存器
(0:没有中断请求 1:有中断请求)
该寄存器有8个标志位,对应相应的引脚是否有待处理的中断请求;
这8个中断标志共用一个中断向量,中断标志不会自动复位,必须软件复
位;
外部中断事件的时间必须>=1.5倍的MCLK的时间,以保证中断请求被接
受;
(5)、PxIES 中断触发沿选择寄存器
(0:上升沿中断
1:下降沿中断)
(6)、PxSEL 功能选择寄存器
(0:选择引脚为I/O端口 1:选择引脚为外围模块功能)
(7)、PxREN 上拉/下拉电阻使能寄存器
(0:禁止 1:使能)
2、P口端口功能示意图:
3、基本操作:
(1)、所有P口都可作为通用IO口使用
(2)、所有P口都可进行字节操作和位操作
按字节操作:
例:
P1DIR=0xff; //将P1口作为输出口
PIOUT=0x20; // P1口输出0x20
P1DIR=0x00; //将P1口作为输入口
data=P1IN
//读取P1口外部输入值
按位操作:
例: P1DIR=BIT0;
//将P1.0作为输出口
P1OUT|=BIT0; //P1.0输出1
P1OUT&=~BIT0; //P1.0输出0
P1DIR&=~BIT0 //将P1.0口作为输入
data=P1IN&BIT0 //读取P1.0口外部输入值
三、中断
1、中断源:
外部中断:P1、P2、定时器中断、看门狗定时器中断、串口中断、A/D转换
中断、比较器中断。
2、中断的 一般设置:
(1)、打开、关闭局部中断:
打开局部中断一般是给想关的特殊功能寄存器相关位置1
以P1口外部中断为例:
打开局部中断:
P1IE|=BIT0;//打开P1.0外部中断 ,BIT0的值为0x01,即把P1IE的第一位置1
关闭局部中断一般是给想关的特殊功能寄存器相关位置0
同样以P1口外部中断为例:
关闭局部中断:
P1IE&=~BIT0;//关闭P1.0外部中断
(2)、打开、关闭全局中断:
_EINT();//打开总中断,相当于51的EA=1;
_DINT();//关闭总中断,相当于51的EA=0;
(3)、各中断向量Interrupt Vectors:
•
•
•
•
•
•
•
•
•
PORT1_VECTOR
PORT2_VECTOR
ADC10_VECTOR
TIMER0_VECTOR
TIMER0_A0_VECTOR
TIMER0_A1_VECTOR
TIMER1_A0_VECTOR
TIMER1_A1_VECTOR
WDT_VECTOR
(4)、中断应用程序举例(外部中断):
void interrupt_initial()
{
P1DIR&=~BIT7;
//P1.7为输入
P1IE|=0x80;
//P1.7中断允许
P1IES|=0x00; //P1.7上升沿触发
P1IFG=0;
//P1.7中断标志清除,对于多源中断必须先清中断标志再打开中断
_EINT();
//总中断允许
}
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
P1IFG&=~BIT7; //P1.7中断标志清除
/*在此写中断服务子程序*/
}
•
#pragma vector - 下面的函数是一个用于所列矢量的中断
• __interrupt void - 识别中断名称
四、定时器

异步16位定时器/计数器

连续、递增-递减、递增计
数模式

3个捕获/比较寄存器

PWM 输出

中断向量寄存器,实现快速
中断响应

可触发DMA

多个时钟源可选

所有430均有Timer_A
16-bit Timer
TAR
TACLK
ACLK
SMCLK
INCLK
Count
Mode
Set
TAIFG
CCR0
CCR1
CCR2
Capture
Mode
CCI2A
CCI2B
GND
VCC
TACCR2
Compararator 2
CCI
SCCI
Y
A
EN
Set
CCIFG2
Output
Unit2
本次课程设计中,采用增计数模式产生PWM波
增计数模式:
捕获/比较寄存器CCR0用作Timer_A增计数模式的周
期寄存器,因为CCR0为16位寄存器,所以该模式
适用于定时周期小于65536的连续计数情况。计数器
TAR可以增计数到CCR0的值,当计数值与CCR0的
值相等时,定时器复位,并从0开始重新计数。
增计数模式:
增计数模式
0FFFFh
例程:
0h
void zengjishu()
{
TACTL=TASSEL1+TACLR; //选择计数时钟为ACLK,将计数器TAR清零
CCTL0=CCIE;
//使能中断
CCR0=200;
//计数终值,方波频率为:32768/200/2
TACTL|=MC_1;
//选择Timer_A为增计数模式
P1DIR|=BIT0;
//P1.0作为输出
_EINT();
//使能总中断
}
#pragma vertor =TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=0X01; //P1.0取反
}
例程
#include"in430.h"
#include "msp430g2553.h"
static unsigned char temp = 0xaa;
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1DIR = 0xff;
//设定P1口为输出方式
P1OUT = 0xff;
//给P1口赋初始值
TA0CCTL0 = CCIE; //打开中断 (Timer0_A3 Capture/Compare Control 0 )
TA0CCR0 = 50000;
//设定计数变量
TA0CTL = TASSEL_2 + MC_2; //定时器选择时钟SMCLK,使用模式二连续计数方式
_EINT();
//开总中断
while(1)
{ LPM0;
} //开启低功耗模式0,进入低功耗模式,等待中断唤醒
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void time1(void)
{
temp = ~temp;
//取反
P1OUT = temp;
//P1口赋值
}
五、ADC10
一、主要特点:
1、 10位转换精度。
2、有多种时钟源可供选择,内带时钟发生器。
3、配有6个外部通道和2个内部通道。
4、内置参考电源,并且参考电压Vref有8种组合。
5、采样速度快,最快200Ks/s。
6、四种工作模式:
1、单通道单次转换模式: CONSEQ_0。
2、单通道多次转换模式: CONSEQ_2。
3、序列通道单次转换模式:CONSEQ_1 。
4、序列通道多次转换模式:CONSEQ_3。
例程:
P1SEL&=0x20;
//使能A/D通道A5;
ADC10CTL0 = ADC10SHT_1+ ADC10ON+SREF_1+REF2_5V+REFON+MSC;
// 打开ADC10内核,确定采样周期为8*ADC10OSC/2,选择内部参考电压为2.5v;
ADC10CTL1 = INCH_5+ADC10DIV_1+CONSEQ_2;
// input A5模拟信号输入选择通道A5即P1.5,设置为单通道多次转换模式,分频因子为2
ADC10AE0 |= BIT5;
// 使P1.5允许AD模拟输入信号
ADC10CTL0|=ENC;
//使能转换;
ADC10CTL0|=ADC10SC;
//开始转换;
单片机系统
本课程设计是把输入电压通过buck电路降压给锂电池充电,锂电池电压输出
端通过boost电路升压输入到逆变桥得到交流电。有三处用到单片机的地方:
buck电路降压、boost电路升压和逆变桥触发输入信号。前两者通过闭环调节
取得给定电压,逆变桥触发输入信号则是由单片机输出SPWM波。
充电部分
软件设计
定时器中断模块
设置定时器中断TIMER_A
(1) 它的工作方式和周期,此处设为使用 32位的周期定时器
TIMER1_A0,周期为 1ms。
(2) 使能定时器中断。
(3) 使能定时器
在定时器中断中,对单片机原始频率8MHz 进行8 分频,再
乘以1000 成为TIMER1-A0
的周期1ms,每触发一次中断就计数加1,当计数500 下,即
500ms 后,对转换好的采
样值进行一次处理,进行PI 调节控制输出PWM 波的占空比。
三段式充电:
SPWM
输出SPWM则通过SPWM数组表实现,数组表有足够多的数值,按照正弦
规律变化,实现正弦波的近似输出。当数字表的元素越多,精度越高。