磁悬浮设计文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目设计
主题:基于MSP430F5438的交流磁悬浮控制器的设计
完成时间:2013.11.14
学生姓名:刘天月
指导教师:王庐山
○目○录
一、引言 (1)
二、MSP430F5438单片机简介 (1)
三、磁悬浮控制系统结构框图 (2)
四、系统功能实现分析 (2)
五、程序功能说明 (3)
六、程序清单(附) (5)
一、引言
磁悬浮是根据电磁感应原理和楞次定律,由交流电流通过线圈产生交变磁场,交变磁场使闭合的导体产生感生电流,感生电流的方向,总是使自己的磁场阻碍原来磁场的变化。
因此线圈产生的磁场和感生电流的磁场是相斥的,若斥力超过重力,可观察到磁悬浮现象。
交流磁悬浮控制器的设计采用MSP430F5438A单片机控制,由检测机构反馈高度电信号给单片机,再由MSP430F5438A单片机产生一路触发脉冲信号,控制交流调压模块电路的输出,从而实现对线圈高度的闭环控制。
二、MSP430F5438单片机简介
MSP430系列单片机是美国德州仪器公司研发的一款16位超低功耗单片机[3],因为其具有精简指令集的混合信号处理器,所以称之为混合信号处理器。
该系列单片机具有如下特点:
◆处理能力强
MSP430系列单片机是一个16位的单片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令。
这些特点保证了可编制出高效率的源程序。
◆运算速度快
MSP430 系列单片机能在25MHz晶体的驱动下,实现40ns的指令周期。
16位的数据宽度、40ns的指令周期以及多功能的硬件乘法器(能实现乘加运算)相配合,能实现数字信号处理的某些算法(如 FFT 等)。
◆超低功耗
MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。
首先,MSP430 系列单片机的电源电压采用的是1.8-3.6V 电压。
因而可使其在1MHz 的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM 保持模式下的最低功耗只有0.1μA。
其次,独特的时钟系统设计。
在 MSP430 系列中有两个不同的时钟系统:基本时钟系统、锁频环(FLL 和FLL+)时钟系统和DCO数字振荡器时钟系统。
可以只使用一个晶体振荡器(32768Hz),也可以使用两个晶体振荡器。
由系统时钟系统产生 CPU 和各功能所需的时钟。
并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。
由于系统运行时开启的功能模块不同,即采用不同的工作模式,芯片的功耗有着显著的不同。
在系统中共有一种活动模式(AM)和五种低功耗模式(LPM0~LPM4)。
在实时时钟模式下,可达2.5μA ,在RAM 保持模式下,最低可达0.1μA 。
◆片内资源丰富
MSP430 系列单片机的各系列都集成了较丰富的片内外设。
它们分别是看门狗(WDT)、模拟比较器A、定时器A0(Timer_A0)、定时器A1(Timer_A1)、定时器B0(Timer_B0)、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-Δ ADC、DMA、I/O端口、基本定时器(Basic Timer)、实时时钟(RTC)和USB控制器等若干外围模块的不同组合。
其中,看门狗可以使程序失控时迅速复位;模拟比较器进行模拟电压的比较,配合定时器,可设计出 A/D 转换器;16 位定时器(Timer_A 和 Timer_B )具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、 PWM 等;有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;具有较多的 I/O 端口,P0、P1、P2 端口能够接收外部上升沿或下降沿的中断输入;10/12位硬件 A/D 转换器有较高的转换速率,最高可达200kbps ,能够满足大多数数据采集应用;能直接驱动液晶多达 160 段;实现两路的 12 位 D/A 转换;硬件I2C 串行总线接口实现存储器串行扩展;以及为了增加数据传输速度,而采用的DMA 模块。
MSP430 系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。
另外,MSP430 系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。
当系统处于省电的低功耗状态时,中断唤醒只需5μs 。
方便高效的开发环境
MSP430 系列有 OTP 型、 FLASH 型和 ROM 型三种类型的器件,这些器件的开发手段不同。
对于 OTP 型和 ROM 型的器件是使用仿真器开发成功之后烧写或掩膜芯片;对于
FLASH 型则有十分方便的开发调试环境,因为器件片内有 JTAG 调试接口,还有可电擦写的 FLASH 存储器,因此采用先下载程序到 FLASH 内,再在器件内通过软件控制程序的运行,由 JTAG 接口读取片内信息供设计者调试使用的方法进行开发。
这种方式只需要一台 PC 机和一个 JTAG 调试器,而不需要仿真器和编程器。
开发语言有汇编语言和 C 语言。
三、磁悬浮控制系统结构框图
磁悬浮控制系统结构框图
四、系统功能实现分析
交流磁悬浮控制器要求实现对线圈悬浮高度的闭环控制。
交流磁悬浮控制器由MSP430F5438A 单片机电路、数码管显示和键盘电路、交流调压电路和串口AD 转换电路(ADS1118)等几部分组成。
MSP430F5438A 控制部分采用TI 公司的MSP430F5438A 为主控芯片;数码管显示和键盘由MSP430F5438A 直接控制和检测;交流调压
电路由MSP430F5438A控制实现调压;线圈悬浮通过带动滑动变阻器产生模拟信号,经过串口AD转换电路变换后送入MSP430F5438A,实现对线圈高度的闭环控制。
交流磁悬浮控制器系统接线图如下:
交流磁悬浮控制器系统接线图
被控制线圈部分实物图
交流调压电路原理图
交流调压电路用于对线圈的控制,实现对线圈的电压控制,从而改变线圈高度。
五、程序功能说明
SW1和SW2为启动与停止按键,分别用于交流磁悬浮控制器启动和停止的控制;SW3为设定高度增加按键;SW4为设定高度减小按键。
具体要求实现如下功能:
1、按键要求:
◆设定功能
按上升“↑”键或下降“↓”键可以设定交流磁悬浮的线圈高度,设定范围为00.0毫米至30.0毫米,设定值在右边四个数码管的后面三个显示,单位毫米;
◆起停功能
按“起动”功能键可实现交流磁悬浮控制器的起动功能,按“停止”功能键可实现交流磁悬浮控制器的停止功能,在开机时控制器要处于停止状态,交流磁悬浮的线圈高度显示“00.0”。
启动前后均可设定交流磁悬浮线圈高度。
2、人机交互要求:
要求前面板数码管显示清晰,稳定,无阴影,频率最高位消隐;根据功能要求显示不同的数值。
按键去抖,避免按键错误判断。
显示按键部分原理图如下:
数码管显示部分原理图
按键部分原理图
六、程序清单(附)
/*
* P4.3(TB0.3)---IN1(Pulse capture)
* P7.3(TA1.2)---OUT1(Pulse Output)
*/
#include"msp430x54xA.h"
#include"BoardConfigure.h"
#include"Clock.h"
#include"ads1118.h"
#include"smg.h"
void CaptureAndPulseOuput_GPIO_Init();
void PID_Init(void);
unsigned int PID_Work();
extern unsigned char Start_Stop;
// PID Parameter setting init
float PID_Set;
float CurrentValue ;
float MinValue;
float MaxValue;
float PID_Measure;
struct PID
{
float Ki;
float Kp;
float Kd;
float E2;
float E1;
float E;
float OutPut;
float ValueSet;
} Control;
volatile unsigned int Sample_V oltage = 0;
int ADC_Result;
extern unsigned int Height_Setting_Value;
unsigned int Height_Sampling_Vlaue = 0 ;
unsigned int Offset_Angle = 0; // Middle timer // Height_Setting_Value = (3.3V/45)*Setting_V oltage_Value,
//45 : 是滑动变阻器的的长度(mm)
// Height_Setting_Value unit : mm; Setting_V oltage_Value unit:mV
//unsigned int Setting_V oltage_Value = 0;
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
Init_Clock(); // Clock Configure,MCLK=SMCLK=20MHZ
IndependentKey_GPIO_Init();
Smg_GPIO_Init();
ADS1118_GPIO_Init(); // ADS1118
ADS1118_SPI_Init();
PID_Init();
// Capture Init
CaptureAndPulseOuput_GPIO_Init();
TBCCTL3 = CM_3 + SCS + CCIS_1 + CAP + CCIE; // Capture both edges,CCIxB
TBCTL = TBSSEL_2 + MC_2 + TBCLR ; // SMCLK_20M,contmode,clear TAR,
__bis_SR_register(GIE);
while(1)
{
while(Start_Stop == 0)
{
Independent_Key_Scan();
LED_Display();
// Offset_Angle = 7000;
__bic_SR_register(GIE);
}
__bis_SR_register(GIE);
Independent_Key_Scan();
// ADS1118 +-4.096V Range, AIN1,860SPS
ADS1118_ADS_Config(0xC3E3);
ADC_Result = ADS1118_ADS_Read(); // Read data from ch1,the last time result
Sample_V oltage = (unsigned int)(((long)(ADC_Result))*4096/32768);// unit : mv
LED_Display();
ADC_Result = ADS1118_ADS_Read(); // Read data from ch1,the last time result
Sample_V oltage = (unsigned int)(((long)(ADC_Result))*4096/32768);
// PID Process,
Height_Sampling_Vlaue=Sample_V oltage/10;
// Height_Sampling_Vlaue= Height_Sampling_Vlaue+10;
PID_Set = 3300.0*Height_Setting_Value/45;
PID_Measure = Sample_V oltage ;
//Offset_Angle = PID_Work();
Offset_Angle = 32000 - PID_Work();
if(Offset_Angle <= 7000)
{
Offset_Angle = 7000 ;
}
if(Offset_Angle >= 32000)
{
Offset_Angle = 32000 ;
}
LED_Display();
}
}
void CaptureAndPulseOuput_GPIO_Init()
{
P4SEL |= BIT3; // P4.3 Select capture
P4DIR &=~BIT3;
P7DIR |= BIT3; // P7.3 select output LOW Default P7OUT &=~BIT3;
}
// TimerB Interrupt Vector (TBIV) handler
#pragma vector=TIMER0_B1_VECTOR
__interrupt void TIMER0_B1_ISR(void)
{
switch(__even_in_range(TBIV,14))
{
case 0: break; // No interrupt
case 2: break;
case 4: break; // reserved
case 6: __no_operation();
// 触发角度从1.8°到179.2°,旁边为电网误差偏移量
// 对应延时时间Offset_Angle:6000~45000
TA1CCR0 = Offset_Angle;
TA1CTL = TASSEL_2 + MC_1 + TACLR + TAIE; // smCLK=5M, upmode, clear TAR
break; // reserved
case 8: break; // reserved
case 10: break; // reserved
case 12: break; // reserved
case 14:
__no_operation();
LED1_ON;
break; // overflow
default: break;
}
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
unsigned char i = 0;
switch(__even_in_range(TA1IV,14))
{
case 0: break; // No interrupt
case 2: break; // CCR1 not used
case 4: break; // CCR2 not used
case 6: break; // reserved
case 8: break; // reserved
case 10: break; // reserved
case 12: break; // reserved
case 14: for(i=0;i<5;i++)
{
P7OUT ^=BIT3;
Delay_us(50);
}
P7OUT &=~BIT3; // overflow
TA1CTL &=~TAIE;
break;
default: break;
}
}
void PID_Init(void)
{
MinValue=0; // Offset_Angle = 6000 , AC output voltage up to max
MaxValue=32000; // Offset_Angle = 40000 , AC output voltage up to min
Control.Kp=2;
Control.Ki=0.1;
Control.Kd=0;
PID_Set=0;
Control.OutPut=32000;
}
unsigned int PID_Work()
{
float Up,Ui,Ud;
float Ax,Bx,Cx,Tx=0.05; // TX:sampling frequency
Control.ValueSet = PID_Set; //普通增量式PID
CurrentValue = PID_Measure;
Control.E = Control.ValueSet-CurrentValue;
Ax=Control.Kp*(1+Tx/Control.Ki+Control.Kd/Tx);
Bx=Control.Kp*(1+2*Control.Kd/Tx);
Cx=Control.Kp*(Control.Kd/Tx);
Up =Ax*Control.E;
Ui = Bx*Control.E1;
Ud = Cx*Control.E2;
Control.E2 = Control.E1;
Control.E1 = Control.E;
Control.OutPut +=(Up-Ui+Ud);
if(Control.OutPut<MinValue)
Control.OutPut=MinValue;
else if (Control.OutPut>MaxValue)
Control.OutPut=MaxValue;
return (unsigned int)Control.OutPut;
}
//DCP-202 from left to right ,corresponding first to eighth LED
//first to last LED corresponding to Bit selection:
//P3.0,P3.5,P3.4,P11.0,P11.1,P11.2,P1.6,P1.7;
// DCP-202(P1)--------DCP-200(JC)
// KEY1------P2.4----Start
// KEY2------P2.5----Stop
// KEY3------P2.6-----Increase
// KEY4------P2.7-----Decrease
#include"msp430x54xA.h"
#include"BoardConfigure.h"
#include"smg.h"
unsigned char Start_Stop = 0;
unsigned int Height_Setting_Value = 0; // unit : mm
extern unsigned int Height_Sampling_Vlaue ;
const unsigned char Dis_Data[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; // Common Anode segment code void Independent_Key_Scan(void)
{
unsigned char KeyValue = 0;
if((P2IN&0xf0)!= 0xf0)
{
LED_Display(); // Delay10ms
if((P2IN&(BIT4 + BIT5 + BIT6 + BIT7))!= (BIT4 + BIT5 + BIT6 + BIT7))
{
if((P2IN&BIT4)!=BIT4) // Start
KeyValue = 1;
}
if((P2IN&BIT5)!=BIT5) // Stop
{
KeyValue = 2;
}
if((P2IN&BIT6)!=BIT6) // Increase {
KeyValue = 3;
}
if((P2IN&BIT7)!=BIT7) // Decrease {
KeyValue = 4;
}
}
while(((P2IN&(BIT4 + BIT5 + BIT6 + BIT7))!= (BIT4 + BIT5 + BIT6 + BIT7))) {
LED_Display();
}
LED_Display();
if(KeyValue == 1)
{
Start_Stop = 1;
}
if(KeyValue == 2)
{
Start_Stop = 0;
}
// height setting,unit mm,LSB Height is 1mm
if(KeyValue == 3)
{
if(Height_Setting_Value >= 30)
{
Height_Setting_Value = 30;
}
else
{
Height_Setting_Value += 2;
}
}
if(KeyValue == 4)
{
if(Height_Setting_Value <= 0)
{
Height_Setting_Value = 0;
}
else
{
Height_Setting_Value -= 2;
}
}
}
}
void IndependentKey_GPIO_Init(void)
{
P2DIR &=~(BIT4 + BIT5 + BIT6 + BIT7); // Select P2.4-7 as Input
}
void Smg_GPIO_Init()
{
P8DIR |= 0xff; // Segment code,a~h----p8.0~p8.7,select output,LOW Valid
LED_Segment |= 0xff;
P3DIR |= BIT0+BIT5+BIT4; // Bits Code,select output,Low level on transistor
P11DIR |= BIT0+BIT1+BIT2;
P1DIR |= BIT6+BIT7;
P3OUT |= BIT0+BIT5+BIT4;
P11OUT |= BIT0+BIT1+BIT2;
P1OUT |= BIT6+BIT7;
}
// DCP-202 前面四个数码管显示转速,后面为调制信号频率
void LED_Display()
{
/*
LED_Selection_Bit0;
LED_Segment = Dis_Data[Motor_Speed / 1000];
Delay_ms(1);
*/
LED_Selection_Bit1;
LED_Segment = Dis_Data[Height_Sampling_Vlaue /100];
Delay_ms(1);
LED_Selection_Bit2;
LED_Segment = Dis_Data[ Height_Sampling_Vlaue/10%10]&0x7f; // Open dot
Delay_ms(1);
LED_Selection_Bit3;
LED_Segment = Dis_Data[Height_Sampling_Vlaue % 10];
Delay_ms(1);
/*
LED_Selection_Bit4;
LED_Segment = Dis_Data[Fc * 10 / M / 100];
Delay_ms(1);
*/
LED_Selection_Bit5;
LED_Segment = Dis_Data[Height_Setting_Value / 10];
Delay_ms(1);
LED_Selection_Bit6;
LED_Segment = (Dis_Data[Height_Setting_Value % 10])&(0x7f);
Delay_ms(1);
LED_Selection_Bit7;
LED_Segment = Dis_Data[0];
Delay_ms(1);
LED_Selection_Bit_Off; // Close Led display
Delay_ms(1);
}
/*
void init_clock(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P5SEL |= 0x0C; // Port select XT2
UCSCTL6 &= ~XT2OFF; // Ena××e XT2 even if not used UCSCTL3 |= SELREF_2; // FLLref = REFO
UCSCTL4 |= SELA__XT2CLK; //辅助系统时钟来源XT2-25M UCSCTL4 |= SELS_5 + SELM_5; // SMCLK=MCLK=XT2-25M
_NOP();
UCSCTL5 |= DIVM__2 + DIVS__16+DIV A__16; // MCLK25M,SMCLK==ACLK=25M/16
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags
for(i=0;i<0xFFFF;i++); // Delay for Osc to stabilize
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}
*/
/*
void main()
{
GPIO_Init();
init_clock();
while(1)
{
LED_Display();
}
}
*/
/*
* smg.h
*
* Created on: 2013-5-30
* Author: Administrator
*/
#ifndef SMG_H_
#define SMG_H_
#define LED_Segment P8OUT
#define LED_Selection_Bit0 P3OUT &=~BIT0;P3OUT |= BIT5+BIT4;P11OUT |= BIT0+BIT1+BIT2;P1OUT |= BIT6+BIT7
#define LED_Selection_Bit1 P3OUT &=~BIT5;P3OUT |= BIT0+BIT4;P11OUT |= BIT0+BIT1+BIT2;P1OUT |= BIT6+BIT7
#define LED_Selection_Bit2 P3OUT &=~BIT4;P3OUT |= BIT0+BIT5;P11OUT |= BIT0+BIT1+BIT2;P1OUT |= BIT6+BIT7
#define LED_Selection_Bit3 P11OUT &=~BIT0;P3OUT |= BIT0+BIT5+BIT4;P11OUT |= BIT1+BIT2;P1OUT |= BIT6+BIT7
#define LED_Selection_Bit4 P11OUT &=~BIT1;P3OUT |= BIT0+BIT5+BIT4;P11OUT |= BIT0+BIT2;P1OUT |= BIT6+BIT7
#define LED_Selection_Bit5 P11OUT &=~BIT2;P3OUT |= BIT0+BIT5+BIT4;P11OUT |= BIT0+BIT1;P1OUT |= BIT6+BIT7
#define LED_Selection_Bit6 P1OUT &=~BIT6;P3OUT |= BIT0+BIT5+BIT4;P11OUT |= BIT0+BIT1+BIT2;P1OUT |= BIT7
#define LED_Selection_Bit7 P1OUT &=~BIT7;P3OUT |= BIT0+BIT5+BIT4;P11OUT |= BIT0+BIT1+BIT2;P1OUT |= BIT6
#define LED_Selection_Bit_Off P3OUT |= BIT0+BIT5+BIT4;P11OUT |= BIT0+BIT1+BIT2;P1OUT |= BIT6+BIT7
void Smg_GPIO_Init();
//void init_clock(void);
void LED_Display();
void Independent_Key_Scan(void);
void IndependentKey_GPIO_Init(void);
#endif /* SMG_H_ */
// MSP430F5438A
// -----------------
// /|\| |
// | | |
// --|RST |
// | |
// | P3.7|-> Data Out (UCB1SIMO)
// | |
// | P5.4|<- Data In (UCB1SOMI)
// | |
// \CS <-|P1.1 P5.5|-> Serial Clock Out (UCB1CLK)
//
//
// Shuyang Zhong
// U-Program China, Texas Instruments Inc.
// Mar 2013
// Built with CCE Version: 5.1.1
//******************************************************************************
#include "msp430x54xA.h"
#include"ads1118.h"
void ADS1118_GPIO_Init(void)
{
P1OUT |= 0x02; // Set P1.1 for CS
P1DIR |= 0x02; // Set P1.1 to output direction
P3SEL |= 0x80; // P3.7 option select
P5SEL |= 0x30; // P5.4,5 option select
P5DIR |= 0x01; // Set P5.0 to output direction
}
void ADS1118_SPI_Init(void)
{
UCB1CTL1 |= UCSWRST; // **Put state machine in reset**
UCB1CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI master
// Clock polarity high, MSB UCB1CTL1 |= UCSSEL_2; // SMCLK
UCB1BR0 = 0x05; // /2
UCB1BR1 = 0; //
UCB1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
__delay_cycles(100); // Wait for slave to initialize
}
void ADS1118_ADS_Config(signed int temp_config_value)
{
signed int Config_Value;
Config_Value = temp_config_value;
//Config_Value = 0x8583; // Initial Config Register
// ADS1118 configuration AIN0/AIN1, FS=+/-2.048, DR=128sps, PULLUP on DOUT
P1OUT &=~ 0x02; // Set CS low
__delay_cycles(100); // Wait for slave to initialize ADS1118_WriteSPI(Config_Value,0); // Write configuration to ADS1118 __delay_cycles(100); // Wait for slave to initialize
P1OUT |= 0x02; // Set CS high
}
int ADS1118_ADS_Read(void)
{
unsigned int Data, Config_Value;
//Config_Value = 0x058B;
Config_Value = 0;
// ADS1118 configuration AIN0/AIN1, FS=+/-2.048, DR=128sps, PULLUP on DOUT
P1OUT &=~ 0x02; // Set CS low
Data = ADS1118_WriteSPI(Config_Value,1); // Read data from ADS1118 P1OUT |= 0x02; // Set CS high
return Data;
}
/*
* Mode 0: Only write config register to ADS1118
* Mode 1: Write config register to ADS1118 as well as read data from ADS1118
*/
signed int ADS1118_WriteSPI(unsigned int config, unsigned char mode)
{
signed int msb;
unsigned int temp;
signed int dummy;
temp = config;
if (mode==1) temp = 0;
while(!(UCB1IFG&UCTXIFG));
UCB1TXBUF = (temp >> 8 ); // Write MSB of Config
while(!(UCB1IFG&UCRXIFG));
msb = UCB1RXBUF; // Read MSB of Data
while(!(UCB1IFG&UCTXIFG));
UCB1TXBUF = (temp & 0xff); // Write LSB of Config
while(!(UCB1IFG&UCRXIFG));
msb = (msb << 8) | UCB1RXBUF; // Read LSB of Data
while(!(UCB1IFG&UCTXIFG));
UCB1TXBUF = (temp >> 8 ); // Write MSB of Config
while(!(UCB1IFG&UCRXIFG));
dummy = UCB1RXBUF; // Read MSB of Config
while(!(UCB1IFG&UCTXIFG));
UCB1TXBUF= (temp & 0xff); // Write LSB of Config
while(!(UCB1IFG&UCRXIFG));
dummy = (dummy <<8) | UCB1RXBUF; // Read LSB of Config
__delay_cycles(100);
return msb;
}
/*
void main(void)
{
volatile int ADC_Result;
float V oltage_ch1;
float V oltage_ch2;
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
ADS1118_GPIO_Init();
ADS1118_SPI_Init();
//ADS_Config();
while(1)
{
ADS1118_ADS_Config(0xB583); //config ch2
ADC_Result = ADS1118_ADS_Read(); // Read data from ch1,the last time
result
V oltage_ch1 = ADC_Result*1.0/32768*2.048;
__delay_cycles(10000); //need to wait time until end of convert
ADS1118_ADS_Config(0x8583); //config ch1
ADC_Result = ADS1118_ADS_Read(); // Read data from ch1,the last time
result
V oltage_ch2 = ADC_Result*1.0/32768*2.048;
__delay_cycles(10000);
if(V oltage_ch1<V oltage_ch2) //Range +1.0V to +1.2V
{
P5OUT &=~BIT0; // If result exceed the range, toggle LED1 }
else P5OUT |= BIT0; // If in the range, light LED1
}
}
*/
#ifndef __ADS1118_H__
#define __ADS1118_H__
void ADS1118_GPIO_Init(void);
void ADS1118_SPI_Init(void);
void ADS1118_ADS_Config(signed int temp_config_value);
int ADS1118_ADS_Read(void);
signed int ADS1118_WriteSPI(unsigned int Config, unsigned char mode);
#endif
#include"msp430x54xA.h"
#include"Clock.h"
void Init_Clock()
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P7SEL |= 0x03 ; // 端口选择外部低频晶振XT1
UCSCTL6 &=~XT1OFF ; // 使能外部晶振
UCSCTL6 |= XCAP_3 ; // 设置内部负载电容
UCSCTL3 |= SELREF__XT1CLK ; // DCOref = XT1
UCSCTL4 |= SELA_0 ; // ACLK = XT1
__bis_SR_register(SCG0) ; // 关闭FLL控制回路
UCSCTL0 = 0x0000 ; // 设置DCOx, MODx
UCSCTL1 = DCORSEL_7 ; // 设置DCO振荡范围
UCSCTL2 = FLLD__1 + 609 ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
__bic_SR_register(SCG0) ; // 打开FLL控制回路
__delay_cycles(1024000) ;
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
UCSCTL5 |= DIVM__1 + DIVS__4; //MCLK=20M;SMCLK=5M;ACLK=32768
}
/*
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// P11DIR = BIT0+BIT1+BIT2; // P11.1-2 to output direction
//P11SEL |= BIT0+BIT1+BIT2; // P11.1-2 to output SMCLK,MCLK P5SEL |= 0x0C; // Port select XT2
UCSCTL6 &= ~XT2OFF; // Ena××e XT2 even if not used UCSCTL3 |= SELREF_2; // FLLref = REFO
UCSCTL4 |= SELA_2; // ACLK=REFOCLK
UCSCTL4 |= SELS_5 + SELM_5; // SMCLK=MCLK=XT2-25M
_NOP();
UCSCTL5 |= DIVM__1 + DIVS__4; //MCLK=25M;SMCLK=25/4M;ACLK=32768
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags
for(i=0;i<0xFFFF;i++); // Delay for Osc to stabilize
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}*/
#ifndef __CLOCK_H__
#define __CLOCK_H__
void Init_Clock();
#endif
// Description; CPU Frequency (MCLK)=25MHZ
//
// MSP430F5438A
// -----------------
// /|\| XIN2|-
// | | | 25MHZ
// --|RST XOUT2|-
// | |
// | P9.6 Buzzer|<--AN1(KEY1)
// | P10.6|<--AN1(KEY1)
// | P10.7|<--AN2(KEY2)
// | P5.0|-->LED1
// | P5.1|-->LED2
//
#ifndef __BOARDCONFIGURE_H__
#define __BOARDCONFIGURE_H__
#include "msp430x54xA.h" // Import msp430x54xA.h
#define CPU_F ((unsigned long)20) // Unit MHZ
#define Delay_us(x) __delay_cycles((unsigned int)x*CPU_F) // Unit us
#define Delay_ms(x) __delay_cycles(CPU_F*(unsigned int)x*1000) // Unit ms
#define LED1_ON P5DIR |= BIT0 ; P5OUT &= ~BIT0 // Low valid
#define LED1_OFF P5DIR |= BIT0 ; P5OUT |= BIT0
#define LED2_ON P5DIR |= BIT1 ; P5OUT &= ~BIT1 // Low valid
#define LED2_OFF P5DIR |= BIT1 ; P5OUT |= BIT1
#define Buzzer_ON P9DIR |= BIT6 ; P9OUT |= BIT6 // High valid
#define Buzzer_OFF P9DIR |= BIT6 ; P9OUT &= ~BIT6
#endif
19。