2014-金属物体探测定位器(B题)报告资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

金属物体探测定位器(B 题)
【本科组】
2013109122 刘泗军2013109128 赵梦欢2013109227 王霄鸷
三峡大学
纲要:********** 300 字以内的设计中文纲要,宋体,四号字**********
该系统以单片机 MSP430F5529单片机为控制核心,由 LDC1000电感传
感器探测目标物体,经过比较无目标物体处和有目标物体处传感器的返回值
来确立目标物体的地点。

经过单片机产生PWM控制两个轴向的小车运动,X 轴方向小车负责行扫描, Y 轴方向小车负责列扫描,进而实现了固定在 X轴小车上的 LDC1000电感传感器探测并定位目标物体的功能,采纳以 LM7805 稳压芯片为核心的电源电路为系统供电。

本课题所采纳的电路简单,算法合理。

经过实质制作和测试,完好达到了
题目基本部分和发挥部分的全部要求,成效很好
重点字: LDC1000 MSP430F5529 电感检测(不超出 5 个)
(英文纲要,可选项)
(英文重点字,可选项)
前言
跟着电子技术的进步,金属探测器从电子管、晶体管以致集成电路,有了更新换代
的发展,其应用范围几乎扩大到各个领域,对工业生产以致人身安全起侧重要的作用。

当前,金属探测器大概分为两种种类:①安装在冶金、烧结、水泥、玻璃、造纸、化工、
卷烟等工厂和矿山生产线的自动传递皮带上,用以检测矿石、烟草等原猜中混入的废金
属,保护破裂机不受损害,此类称为“工业型金属探测器”;②跟着交通、旅行、金融
和娱乐事业的发展,在机场、银行、珠宝店和珠宝制造厂、贵金属加工厂等,需要对过
往人员进行检测,以使名贵物件不丢掉及清除危险品、枪支等,此类称为“安全型金属
探测器”。

它们应用宽泛,效益可观。

几千元一台的金属探测器便可以保护价值十几万
的矿石破裂机;几万至几十万元买一套安全门式金属探测器,能够保护价值上千万元以
致上亿元的飞机及人身安全。

所以对金属探测器的研究和生产惹起国内外专家的高度重视。

本系统中的LDC1000 是世界首款电感觉数字传感器,拥有低功耗,小封装,低成
本的特色,它的SPI 接口能够很方便连结MCU ,只要外接一个 PCB 线圈或许自制线圈便可以实现非接触式电感检测。

LDC1000 的电感检测其实不是指像 Q 那样测试线圈的电感量,而是能够测试外面金属物体和LDC1000 相连的测试线圈的空间地点关系。

利用LDC1000 这个特征配之外面设计的金属物体即可很方便实现:水平或垂直距离检测;角度检测;位移检测;运动检测;振动检测;金属成分检测(合金检测)。

能够宽泛应用在汽车、花费电子、计算机、工业、通讯和医疗领域。

1系统方案
比较与选择
1.1.1 机械构架选择方案
为了正的确现金属探测器可自主挪动,金属物体探测定位装置的挪动方式是整个设
计的基础,它对整个系统的工作尤其重要。

经过频频论证对照,本系统中金属物体探测定
位装置采纳小车挪动进而带动 LDC1000传感器进行扫描,而不用牙条、传递带等机械构
造传动,采纳小车在保证系统稳固的前提下简化了系统构造,提升了扫描速度,同时有效
的降低了制作成本。

方案一:步进电机固定角度旋转及导轨小车单向来回运动扫描
将一个步进电机放在正方形铁丝框随意一角,碳素杆一端固定在该电机上,以电机
为中心,以铁丝一边为 X 轴(与之垂直并以电机中心轴为公共点的另一条铁丝为Y 轴),从X 轴出发,做圆弧线运动,旋转角度范围为0~90゜,固定旋转角度可设置。

沿碳素杆
方向有一个以碳素杆为导轨的两轮小车作为导轨小车(车身与固定导轨贯连的电动小车),该小车沿碳素杆做单向来回运动。

LDC1000 传感器固定在导轨小车前端,可经过
步进电机旋转进而带动传感器在水平面玻璃板上做旋转扫描,当传感器旋转到界限铁
丝,传感器收集信息传给单片机,单片机快速作出判断,进而防止错误指示。

步进电机
固定角度旋转及导轨小车单向来回运动可实现传感器扫描检测,进而定位玻璃板上的铁丝
框内随意一点,当定位指针指定在硬币(或铁圈)边缘以内,单片机发出指令,快速进行
声 -光报警指示。

系统构造图如图 1 所示。

Y
扫描
传感器
小车
循迹
旋转小车
传感器电机
旋转
O
电机
X
图 2 循迹扫描构造图图 1 旋转扫描构造图
方案二:循迹小车沿铁丝运动扫描
考虑到铁丝框为规则正方形,探测地区距探测界限≥5cm,可采纳循迹小车沿铁丝运动。

在小车车身顶端固定一个步进电机,碳素杆一端固定在该电机上,碳素杆另一端
固定 LDC1000 传感器,碳素杆长度 >25cm。

小车沿铁丝运动过程中,传感器探头由电机
带动做圆弧形运动。

相同当传感器旋转到界限铁丝,传感器收集信息传给单片机,单片
机快速作出判断,进而防止错误指示。

循迹小车前端固定两个LDC1000 传感器,一个位于铁丝圈内部,一个位于铁丝圈外面,用于保障小车沿铁丝水平运动及转向。

当探头
检测到金属物体,封闭小车前端传感器,小车进入到铁丝框以内快速定位并进行声-光报警指示。

系统构造图如图 2 所示。

方案三:平行于 X 、 Y 轴的导轨小车进行队列扫描
该设计采纳平行于 X 、Y 轴的导轨小车作为探测定位装置的主体构架,用平行于Y 轴的坦克小车作为双导轨小车(简称Y 轴小车),将碳素杆一端固定在Y 轴小车车身顶端,沿碳素杆方向有一个以碳素杆为导轨的两轮小车作为平行于X 轴的导轨小车(简称 X 轴小车), X 轴小车沿碳素杆做单向来回运动。

为了保证系统稳固,Y 轴小车依据控制算法确立运动必定距离后停低等候,当X 轴小车进行行扫描回到该行起点,Y 轴小车持续依据控制算法行进,这样重复履行上述过程即可达成整个队列扫描。

经过传感
器探头检测到界限铁丝时,传感器收集信息传给单片机,单片机快速判断小车的地点并
发出控制指令。

当进行行扫描时,半途检测到金属物体,单片机控制X 轴小车停下,同时快速定位并进行声 -光报警指示。

系统构造图如图 3 所示。

Y
传感器
Y轴
小车
X 轴
小车
O
X
图 3 队列扫描构造图
方案一顶用于旋转的步进电机固定,因此构造更加稳固,扫描方式更简单,可是存
在步进电机固定旋转角度时旋转速度较慢,用直流电机又不简单控制速度的问题。

方案
二构造简单小巧,便于用于小范围探测,因此适用性更强,可是控制算法相对过于复杂,探测敏捷度相对较差。

经过实验论证与剖析,在知足题目要求的状况下,方案三采纳队列扫描,使用导轨
小车能够提升金属物体探测定位装置的稳固性。

同时导轨小车速度相对较快,能够减少
扫描过程的时间。

此外,因为导轨平行于铁丝,,便于判断小车的地点,同时更简单区
分铁丝与检测物体。

故本系统采纳方案三的机械架构进行扫描。

1.1.2 电机选择方案
在上述机械架构方案三中,关于导轨小车正常高效运动,电机的选择至关重要,。

电机的种类有好多,在智能小车制作顶用得最多的是步进电机、舵机、和直流电机,依据不一样选择,选择适合的电机。

方案一:步进电机。

步进电机可将电脉冲信号转变成角位移,电机的转速、停止的
地点只取决于脉冲信号的频次和脉冲数,而不受负载变化的影响,所以,不只控制精度高,并且简单靠谱。

假如负荷不超出步进电机所能供给的动向转矩值,便可以立刻使步
进电机启动或停止。

方案二:舵机。

舵机的转动地点是内部反应的,地点和频次呈线性关系,所以给一
个固定频次的 PWM波,舵机就会转到一个特定的地点,无需驱动电路,绝对式的系
统,不论来回多少次,都不会有偏差积累。

可是其价钱较贵,别的,舵机的转动需要时
间较长,速度较慢。

不可以知足题目的转动速度要求。

方案三:采纳直流减速电机。

直流减速电机拥有体积小,重量轻,力矩大,控制能
力强,构造紧凑,运转靠谱等长处,可实现直流电能和机械能相互变换,拥有优秀的调
速特征,调整范围广,过载能力强,能蒙受较大重物。

一般用在低速大扭矩场合,步进
功率小,特别适用于控制坦克小车进而进行精准定位。

故本系统采纳方案三。

方案描绘
依据题目的要求,设计任务是经过使用 TI 企业生产的 LDC1000传感器进行电感检测来判断待检测金属的地点并进行声 - 光报警指示。

为了达成上述功能,将整个系统设计为三个基本模块,电机控制模块,扫描检测与信号收集模块和定位显示模块,此中电
机控制模块由稳压电源电路,L298 驱动电路,光耦隔绝电路三部分构成,扫描检测与信
号收集模块由 X 轴小车, Y 轴小车及其导轨构成的扫描载体和LDC1000传感器构成的金属物体探头构成,定位显示模块包含声 - 光报警电路。

整个系统的整体框图如图4所示:
Y 轴小车固定连结
MSP430F5529 L298
连杆导引单片机驱动LDC1000 传感器
X 轴小车
图 4 系统整体框图
本系统核心模块是扫描检测与信号收集模块,机械构架的稳固性决定了金属物体探头收集信号的精准度,采纳平行于X 、Y 轴的导轨小车进行队列扫描的机械构造拥有很好的稳固性,构造和控制算法相对较为简单,
2理论剖析与计算
探测器构成方案与工作原理剖析
LDC1000 的电感检测原理是利用大学物理中讲到的电磁感觉原理。

在PCB 线圈或许自制
物体(如图16 右侧)进入这个电磁场则会在金属物体表面产生涡流(感觉电流)。

涡流电流
跟线圈电流方向相反,涡流产生的感觉电磁场跟线圈的电磁场方向相反。

涡流是金属物体的距
离,大小,成分的函数。

图 16 电感的感觉
涡流产生的反向磁场跟线圈耦合在一同,就像是有另一个次级线圈存在相同。

这样LDC1000 的线圈作为初级线圈,涡流效应作为次级线圈,就形成了一个变压器。

如图17 所示,因为变
压器的互感作用,在初级线圈这一侧便可以检测到次级线圈的参数。

图17互感
上图中Ls 是初级线圈电感值,Rs 是初级线圈的寄生电阻。

L(d) 是互感值, R(d)是互感的寄生电阻,括号顶用 d 是因为它们是距离的函数。

交变电流假如只加在电感上(初级线圈),则在产生交变磁场的同时也会耗费大批的能量。

这时将一个电容并联在电感上,因为LC 的并联谐抖擞用能量消耗大大减小,能量只会消耗在
Rs 和 R(d)上。

以下列图所示。

能够看出检测到R(d) 的消耗便可以间接的检测到d。

检测与控制算法
上电后,先检测传感器返回的数值并保留,以应付不一样环境下传感器返回数值不一样的状况,而后让传感器运动到探头进入区的最左侧,而后开始行扫描,行扫描时及时检
测能否到了界限,若检测到界限,则快速停下,达成一次行扫描; X 轴每扫描完一行后 ,Y 轴小车向前走必定距离,挨次循环,当检测到目标物体后,在目标物体大概范围内进行精美扫描,依据测试传感器的经验,当传感器在目标物体的圆心处时,传感器返回的值
是最大的,故可精美扫描检测最大值,而后在最大值处停住,既可正确立位目标物体。

3电路与程序设计
电路设计
L298N 电机驱动电路
程序构造与设计
4测试方案与测试结果测试方案及测试条件
测试结果
测试结果剖析
经过对不一样地区的测试发现:当在离初始地点远的地区探测并定位时,所花时间比离初始地点近的地区多,说明此算法还有改良的空间
5总结
参照文件
[1]作者,文件名称,第一版社,第一版年代
[2]
[3]
[4]
[5]
次数 1 角 1 角 1 角 1 元 1 元 1 元铁环铁环铁环
时间 (秒) 硬币硬币硬币硬币硬币硬币第一第二第三第一第二第三第一第二第三次次次
地区次次次次次次
A 40 55 51 53 48 52 81 83 86
B 38 42 43 45 49 43 85 78 89
C 70 74 77 68 65 72 98 95 93
D 66 65 70 71 78 68 100 103 97
附录:1.实物图
2.元件清单
3.完好电路图
稳压电源电路
L298N 电机驱动电路主要程序代码
main.c 文件 :
#include "msp430f5529.h"
#include "LDC1000.h"
#include "12864ser.h"
#include "timer.h"
#include "deal.h"
void SetVCoreUp(unsigned int level);
#define RpMIN 0x3A
#define RpMAX 0x13
void main(void)
{
WDTCTL = WDTPW | WDTHOLD;// 停止看门狗SetVCoreUp(1);//电源管理模块初始化SetVCoreUp(2);
SetVCoreUp(3);
//I/O INTERRUPT
//key_Init();
init_lcd();
wr_string(0,0,"pMIN");
wr_string(0,1,"pMAX");
wr_string(0,2,"FreqMIN");
wr_string(0,3,"FreqMAX");
timer_Init();
//UCS SETTING
UCSCTL3 |= SELREF__REFOCLK;//使能 REFO 振荡器
__bis_SR_register(SCG0);// 严禁 FLL 闭环控制
UCSCTL0 = 0x0000;// Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_6;// Select DCO range 24MHz operation
UCSCTL2 = FLLD_0 + 731;// Set DCO Multiplier for 24MHz // (N + 1) * FLLRef = Fdco
// (731 + 1) * 32768 = 24MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0);// Enable the FLL control loop
UCSCTL4|=SELA__DCOCLK+SELS__XT1CLK +SELM__DCOCLK; //ACLK,SMCLK,MCLK Source select
UCSCTL5 |= DIVPA_2;//ACLK output divide ACLK:12MHz
UCSCTL6 |= XT1DRIVE_3 + XCAP_0;//XT1
cap
P3DIR|=BIT0+BIT1+BIT2+BIT3;
//PORT INIT
P1DIR |= BIT0; //(ACLK) LDC CLK for Freq counter (set to output selected clock)
P1SEL |=BIT0;
// LEDs
P7DIR |= BIT0;//改正接线后的红色LED
P4DIR |= BIT7;//GREEN LED
//INTB INIT
//P1DIR &= ~BIT2;// Set P1.2 input
//P1IES |= BIT2;// P1.2 Hi/Lo edge
//P1IFG &= ~BIT2;// P1.2 IFG cleared
//P1IE |= BIT2;// P1.2 interrupt enabled
// initialize SPI STE
P4DIR |= BIT0;// Output
P4SEL &= ~BIT0;
//SPI SETUP
P4SEL |=BIT1 + BIT2 + BIT3;
UCB1CTL1 |=UCSWRST;
UCB1CTL0 |= UCMST+UCMSB+UCSYNC+UCCKPL;// 3-pin, 8-bit SPI master,Clock polarity high, MSB
UCB1CTL1 |= UCSSEL_1;// CLOCK ACLK
UCB1BR0 = 0x06;
UCB1BR1 = 0;
UCB1CTL1 &= ~UCSWRST;//置位 UCSWRST, 开始传输数据/*****************TEST*********TEST***************TEST*******
**/
//read all REG value using default setting
//char orgVal[20];
//write to register
spi_writeByte(RPMAX,RpMAX);
spi_writeByte(RPMIN,RpMIN);
spi_writeByte(SENSORFREQ, 0xB3); //register value:148 0x94
spi_writeByte(LDCCONFIG,0x17);// 设置振荡器振幅:4V, 响应时间 :6144
spi_writeByte(CLKCONFIG,0x00);// 设置 LDC 时钟为外面
时基
spi_writeByte(INTCONFIG, 0x02); //010: INTB pin indicates the status of Comparator output
spi_writeByte(THRESHILSB, 0x50);
spi_writeByte(THRESHIMSB, 0x14); //Comparator Threshold High 5200
spi_writeByte(THRESLOLSB, 0xC0);
spi_writeByte(THRESLOMSB, 0x12); //Comparator Threshold Low 4800
spi_writeByte(PWRCONFIG, 0x01); //Active Mode. Conversion is Enabled
//read all registers
//spi_readBytes(REVID, &orgVal[0],18);
int i;
spi_readBytes(PROXLSB,&p[0],2);
spi_readBytes(FREQCTRLSB,&freq[0],3);
pMAX = ((unsigned char) p[1]<<8) + p [0];
freqMAX = ((unsigned char)freq[1]<<8) + freq[0];
pMIN = pMAX;
freqMIN = freqMAX;
for (i=0;i<100;i++)
{
spi_readBytes(PROXLSB,&p[0],2);
spi_readBytes(FREQCTRLSB,&freq[0],3); pTEMP = ((unsigned char)p[1]<<8) + p [0]; freqTEMP =
((unsigned char)freq[1]<<8) + freq[0]; if (pTEMP < pMIN)
pMIN = pTEMP;
if (freqTEMP < freqMIN)
freqMIN = freqTEMP;
if (pTEMP > pMAX)
pMAX = pTEMP;
if (freqTEMP > freqMAX)
freqMAX = freqTEMP;
//spi_readbytes(LDC1000_CMD_STATUS,)
//read all registers using extended SPI
}
init=(pMAX+pMIN)/2;
Low=init-50;
High=init+50;
set_direction('X',0);
X=6000;
delay_ms(200);
X=0;
delay_s(1);
//while (1)
//{
wr_int(3,0,pMIN);
wr_int(3,1,pMAX);
wr_int(4,2,freqMIN);
wr_int(4,3,freqMAX); init_location();
set_direction('Y',1);
Y=8000;
delay_ms(1000);
Y=0;
for(;;)
{
if(get==1)
break;
else
{
set_direction('X',0);
scan();
}
if(get==1)
break;
else
{
set_direction('X',1);
scan();
}
if(get==1)
break;
else
{
Y=8000;
delay_ms(200);
}
}
wr_int(6,0,1);
wr_int(3,0,pMIN);
wr_int(3,1,pMAX);
wr_int(4,2,freqMIN);
wr_int(4,3,freqMAX);
__no_operation();
//}
}
void SetVCoreUp (unsigned int level)//设置 MCU 核心电压 ,初始化电源模块
{
//获得 PMM 存放器写入权限
PMMCTL0_H = 0xA5;
// Make sure no flags are set for iterative sequences
//while ((PMMIFG & SVSMHDLYIFG) == 0);
//while ((PMMIFG & SVSMLDLYIFG) == 0);
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE +
SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
//Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
//Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
//Lock PMM registers for write
access PMMCTL0_H = 0x00;
}
头文件
#include "msp430f5529.h"
#ifndef LDC1000_CMD_H_
#define LDC1000_CMD_H_
// LDC COMMANDS
#define REVID 0x00
#define RPMAX 0x01
#define RPMIN 0x02
#define SENSORFREQ 0x03
#define LDCCONFIG 0x04
#define CLKCONFIG 0x05
#define THRESHILSB 0x06
#define THRESHIMSB 0x07
#define THRESLOLSB 0x08
#define THRESLOMSB 0x09
#define INTCONFIG 0x0A
#define PWRCONFIG 0x0B
#define STATUS 0x20
#define PROXLSB 0x21
#define PROXMSB 0x22
#define FREQCTRLSB 0x23
#define FREQCTRMID 0x24
#define FREQCTRMSB 0x25
// LDC BITMASKS
#define LDC1000_BIT_AMPLITUDE 0x18 #define LDC1000_BIT_RESPTIME 0x07 #define LDC1000_BIT_CLKSEL 0x02 #define LDC1000_BIT_CLKPD 0x01 #define LDC1000_BIT_INTMODE 0x07 #define LDC1000_BIT_PWRMODE 0x01 #define LDC1000_BIT_STATUSOSC 0x80
#define LDC1000_BIT_STATUSDRDYB0x40
#define LDC1000_BIT_STATUSWAKEUP 0x20
#define LDC1000_BIT_STATUSCOMP 0x10
extern char p[2];
extern char freq[3];
extern int pMIN;
extern int freqMIN;
extern int pMAX;
extern int freqMAX;
extern int pTEMP;
extern int freqTEMP;
char spi_readByte( char addr, char * data);
char spi_readWord(char addr, unsigned int * data); // Big Endian char spi_readBytes( char addr, char * buffer, unsigned char len); char spi_writeByte(char addr, char data);
char spi_writeWord(char addr, unsigned int data); // Big Endian char spi_writeBytes( char addr, char * buffer, unsigned char len);
#endif
LDC1000.c 文件:
#include "LDC1000.h"
static unsigned char txlen; static unsigned char rxlen; static char *txbuf;
static char *rxbuf;
static char txaddr;
static char wordbuf[2];
char p[2];
char freq[3];
int pMIN;
int freqMIN;
int pMAX;
int freqMAX;
int pTEMP;
int freqTEMP;
char spi_readByte( char addr, char * data) {
rxlen = 1;
rxbuf = data;
txaddr = addr | 0x80;
P4OUT &= ~BIT0;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = txaddr;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = 0;
while (UCB1STAT & UCBUSY);
* rxbuf = UCB1RXBUF;
while (UCB1STAT & UCBUSY);
P4OUT |= BIT0;
return 0;
}
char spi_readWord(char addr, unsigned int * data) {
rxlen = 2;
rxbuf = &wordbuf[0];
txaddr = addr | 0x80;
P4OUT &= ~BIT0;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = txaddr;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = 0;
while (UCB1STAT & UCBUSY);
* rxbuf = UCB1RXBUF;
rxbuf++;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = 0;
while (UCB1STAT & UCBUSY);
* rxbuf = UCB1RXBUF;
while (UCB1STAT & UCBUSY);
P4OUT |= BIT0;
return 0;
}
char spi_readBytes( char addr, char * buffer, unsigned char len) {
rxlen = len;
rxbuf = buffer;
txaddr = addr | 0x80;
P4OUT &= ~BIT0;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = txaddr;
while (rxlen > 0)
{
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = 0;
while (UCB1STAT & UCBUSY);
*rxbuf = UCB1RXBUF;
rxbuf++;
rxlen--;
}
while (UCB1STAT & UCBUSY);
P4OUT |= BIT0;
return 0;
}
char spi_writeByte(char addr, char data)
{
wordbuf[0] = data;// copy from stack to memory txlen = 1;
txbuf = &wordbuf[0];
txaddr = addr & ~0x80;
P4OUT &= ~BIT0;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = txaddr;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = *txbuf;
while (UCB1STAT & UCBUSY);
P4OUT |= BIT0;
return 0;
}
char spi_writeWord(char addr, unsigned int data)
{
wordbuf[0] = data >> 8;// Big Endian
wordbuf[1] = data & 0xFF;
txlen = 2;
txbuf = &wordbuf[0];
txaddr = addr & ~0x80;
P4OUT &= ~BIT0;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = txaddr;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = *txbuf;
txbuf++;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = *txbuf;
while (UCB1STAT & UCBUSY);
P4OUT |= BIT0;
return 0;
}
char spi_writeBytes( char addr, char * buffer, unsigned char len)
{
txlen = len;
txbuf = buffer;
txaddr = addr & ~0x80;
P4OUT &= ~BIT0;
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = txaddr;
while (txlen > 0)
{
while (!(UCB1IFG&UCTXIFG));
UCB1TXBUF = *txbuf;
txbuf++;
txlen--;
}
while (UCB1STAT & UCBUSY);
P4OUT |= BIT0;
return 0;
}
timer.h 文件:
#include "msp430f5529.h"
#ifndef TIMER_H
#define TIMER_H
#define X TA2CCR1//X 轴电机速度#define Y TA2CCR2//Y 轴电机速度
void timer_Init();
#endif
timer.c 文件:
#include "timer.h"
void timer_Init()
{
TA2CTL =0;
TA2CTL|=TASSEL__SMCLK+MC__UP+ID__1+TACLR; //SMCLK,continuous
TA2CCR0=8000;//设置 PWM 波周期
TA2CCTL0|=OUTMOD_7;
X=0;//设置 X 轴电机 PWM 波占空比
TA2CCTL1|=OUTMOD_7;
Y=0;//设置 Y 轴电机 PWM 波占空比
TA2CCTL2|=OUTMOD_7;
P2DIR|=BIT4+BIT5;
P2SEL|=BIT4+BIT5;
}
deal.h 头文件:
#include "msp430f5529.h"
#include "delay.h"
#include "timer.h"
#include "LDC1000.h"
#ifndef DEAL_H
#define DEAL_H
#define IN1_0 P3OUT&=~BIT0 //P3.0 IN1 #define IN1_1 P3OUT|=BIT0
#define IN2_0 P3OUT&=~BIT1 //P3.1 IN2 #define IN2_1 P3OUT|=BIT1
#define IN3_0 P3OUT&=~BIT2 //P3.2 IN3 #define IN3_1 P3OUT|=BIT2
#define IN4_0 P3OUT&=~BIT3 //P3.3 IN4 #define IN4_1 P3OUT|=BIT3
extern int Low,High,init,get;
//extern int High;
//extern int init;
//extern int J;
void Sdeal(void);//surrounding deal void Tdeal(void);//target deal
void Edeal(void);//environment deal void set_direction(char z,int d);
void init_location();
void scan();
#endif
文件:
#include "deal.h"
#include "LDC1000.h"
int Low,High,init,Js,Jt,Je,get=0;//J:judge
void set_direction(char z,int d)//
{
switch(z)
{
case 'X':if(d==1){IN1_1;IN2_0;}else{IN1_0;IN2_1;}break;
case 'Y':if(d==1){IN3_1;IN4_0;}else{IN3_0;IN4_1;}break; }
}
//初始化地点
void init_location()
{
set_direction('Y',0);
//X=8000;
35
Y=8000;
for(;;)
{
if(Y==0)
break;
else
Sdeal();
}
}
void scan() {
X=6000;
for(;;)
{
if(X==0)
break;
else
{
Sdeal();
Tdeal();
}
}
}
//surrounding deal
void Sdeal()
{
int i,a;
spi_readBytes(PROXLSB,&p[0],2);
pMAX =((unsigned char) p[1]<<8) + p [0];
pMIN = pMAX;
for (i=0;i<20;i++)
{
spi_readBytes(PROXLSB,&p[0],2);
pTEMP = ((unsigned char)p[1]<<8) + p [0];
if (pTEMP < pMIN)
pMIN = pTEMP;
if (pTEMP > pMAX)
pMAX = pTEMP;
//spi_readbytes(LDC1000_CMD_STATUS,)
//read all registers using extended SPI }
a=(pMAX+pMIN)/2;
Js=(a>Low)&&(a<High);
switch(Js)
{
case 1:X=0;Y=0;break;
case 0:break;
}
}
//target deal
void Tdeal()
{
int i,b;
spi_readBytes(PROXLSB,&p[0],2);
pMAX =((unsigned char) p[1]<<8) + p [0];
pMIN = pMAX;
for (i=0;i<20;i++)
{
spi_readBytes(PROXLSB,&p[0],2);
pTEMP = ((unsigned char)p[1]<<8) + p [0];
if (pTEMP < pMIN)
pMIN = pTEMP;
if (pTEMP > pMAX)
pMAX = pTEMP;
//spi_readbytes(LDC1000_CMD_STATUS,)
//read all registers using extended SPI }
b=(pMAX+pMIN)/2;
Jt=b>High;
switch(Jt)
{
case 1:X=0;Y=0;get=1;break;
case 0:break;
}
}
//environment deal
void Edeal()
{
Je=pTEMP<Low;
switch(Je)
{
case 1:break;
case 0:break;
} }
4.
5.。

相关文档
最新文档