线路检测报告.docx

上传人:b****8 文档编号:9965095 上传时间:2023-02-07 格式:DOCX 页数:18 大小:332.21KB
下载 相关 举报
线路检测报告.docx_第1页
第1页 / 共18页
线路检测报告.docx_第2页
第2页 / 共18页
线路检测报告.docx_第3页
第3页 / 共18页
线路检测报告.docx_第4页
第4页 / 共18页
线路检测报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

线路检测报告.docx

《线路检测报告.docx》由会员分享,可在线阅读,更多相关《线路检测报告.docx(18页珍藏版)》请在冰豆网上搜索。

线路检测报告.docx

线路检测报告

二级项目(嵌入式系统应用)

 

题目:

基于stm32的路检测

学号:

____20134823091__

姓名:

_____王秀峰____

班级:

  13自动C1

专业:

  自动化______

学院:

  _工学部____

入学时间:

 ____2013级

指导教师:

王振华 _

日期:

2015年7月9日

1.线路及实现功能

1.1线路图

1.2功能要求

线路连接之后通过单片机检测线路连接是否正确,如果连接正确输出连接正确,如果连接不正确输出连接错误的点,并统计错误点的个数。

 

2实现方法

2.1原理及思路

原理:

当导线连接在一起时,信号是可以导通的,基于这点可以将电路中需要需要检测的点连接单片机的引脚,单片机引脚依次置位,并在其中一个引脚置位时检测其他引脚的电平,同为高电平说明两个引脚之间有导线连接,判断该导线连接是否正确。

思路:

将GPIOD口的0-11口依次置高电平,每次置高电平后以16位的形式读取GPIOD口的数值,之后对读取到的数据操作,判断是否有错误接线。

2.2伪代码

令A=线路正确连接时的数据。

将第一个引脚置位,读取其他引脚的状态得到数据B。

将AB进行比较,如果A=B,则输出正确,如果A!

=B,跳到第四步。

令B=A|B,得到正确与错误同时存在的数据,在令B=A^B,得到错误点的数据。

将B进行移位操作,得到最低位为1时,根据移位的次数判断哪个引脚对应的线连接错误,并输出错误的位置。

将a进行左移操作重复上述操作。

2.3代码实现

uint16_tn[12]={3,3,140,140,48,48,832,140,832,832,3072,3072};

代码分析:

将正确的数据存入数组n[12]中。

uint16_ta=1;GPIO_Write(GPIOD,a);

代码分析:

声明变量a=1;,并将a的值写入GPIO的ODR寄存器中,如图1

图1

uint16_tReadValue;ReadValue=GPIO_ReadInputData(GPIOD);

代码分析:

声明变量ReadValue;通过GPIO_ReadInputData()函数读取GPIOD的数值。

GPIO_ReadInputData()函数如图2

图2

if(ReadValue==n[i])

{

USART_ClearFlag(USART1,USART_FLAG_TC);

printf("the%dpointisRight\n",i);

}

代码分析:

将ReadValue与n[i]进行比较,如果正确则输出。

uint16_tj,count;

else

{

ReadValue=n[i]|ReadValue;

ReadValue=ReadValue^n[i];

for(j=0;j<12;j++)

{

ReadValue>>=1;

if(ReadValue&1)

{

USART_ClearFlag(USART1,USART_FLAG_TC);

printf("the%dpointiserror",j);

count++;

}

}

}

代码分析:

在第三步判断有错误的情况下,执行此过程,首先将ReadValue=n[i]|ReadValue;得到错误位与正确位同时存在的数据。

ReadValue=ReadValue^n[i];异或之后变量ReadValue中只有错误位,通过循环移位,将错误的数据位找到并输出。

Count统计错误的个数。

 

3程序测试中出现的问题及解决方法

3.1stm32通信问题

在任务开始阶段,测试结果如图3

图3

测试程序

USART1_Config();

GPIOD_Config();

//GPIOD_test();

printf("12\n");

printf("12\n");

while

(1);

使用stm32f10x调试串口通信时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01,0x02,0x03,0x04.接收端收到的数据为:

0x02,0x03,0x04,第一个数据丢失。

查阅stm32f10x参考手册,找到这样一句话:

 

TC:

发送完成标记:

 当前字节帧发送完成后,由硬件将该位置位。

如果USART_CR1中的TCIE为1,则产生中断。

由软件序列清除该位(先读USART_SR,然后写入USART_DR)。

TC位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。

 

0:

发送还未完成; 

1:

发送完成。

 

注意到这一句:

由软件序列清除该位(先读USART_SR,然后写入USART_DR)。

也就是说,要先readUSART_SR,然后writeUSART_DR,才能完成TC状态位的清除。

而硬件复位后,串口发送的首个数据之前没有readSR的操作,是直接writeDR,也就是说,TC没有被清除掉。

硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。

当然,也有别的方法,比如先清除TC状态位,USART_ClearFlag(USART1,USART_FLAG_TC);

3.2引脚输出电平选择及引脚模式选择

在程序测试中对a的赋值有两种,一种是置1,另一种是置零;引脚初始化时可选择为输出的有四种模式,分别为推挽输出模式、开漏输出模式、复用推挽输出模式和复用开漏输出模式。

复用模式是根据GPIO的复用功能来选择的,如GPIO的引脚用作串口的输出,则使用复用推挽输出模式。

所以对于本任务可选的只有前两种。

下面是测试过程中的数据

模式:

推挽输出模式a:

1

模式:

推挽输出模式a:

0xfffe

图4图5

 

模式:

开漏输出模式a:

1

模式:

开漏输出模式a:

0xfffe

图6图7

分析上述数据,

两种情况输出数据无法判别不能使用,

输出的为随机数,根据I/O端口位的基本结构,如图7可知在开漏输出模式时,如果我们控制输出为0,低电平,则

使N-MOS管导通,使输出接地,若控制输出为1(无法直接输出高电平),则既不输出高电平,也不输出低电平,为高阻态。

为正常使用时必须外部外接一个上拉电阻。

所以在本任务中引脚不能设置为开漏输出模式。

图8I/O端口位的基本结构

最终能选择的只有

,但是在测试数据中有几组数据为零,查看接线图,发现数据为0的点均为结点,最后查看STM32的技术手册发现其引脚无法驱动两个引脚,导致输出高电平的引脚被拉低。

 

4测试结果与总结

4.1测试结果

接线完全正确时

图9

接线有误时

图10

4.2总结

通过完成这次任务,使我加深了对stm32的掌握,在过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露了前期我们在这方面的知识欠缺和经验不足。

实践出真知,通过亲手制作,使我掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。

在过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的检验修改环节,本身就是在践行“过而能改,善莫大焉”的知行观。

这次任务终于顺利完成了,在过程中遇到了很多问题,最后在我的不懈的努力下,终于迎刃而解。

在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘。

我认为这次的任务培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。

更重要的是,在过程中,我们学会了很多学习的方法。

而这是日后最实用的,真的是受益匪浅。

要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

这对于我们的将来也有很大的帮助。

以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。

就像中国提倡的艰苦奋斗一样,我们都可以在课程设计结束之后变的更加成熟,会面对需要面对的事情。

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

总之,认真对待每一个学习的机会,珍惜过程中的每一分一秒,学到最多的知识和方法,锻炼自己的能力,这个是我们在在本次课程设计中学到的最重要的东西,以后也将受益匪浅的!

附录

单片机引脚连接图

线路连接图

程序

main.c

#include"stm32f10x_conf.h"

#include"usart.h"

#include"gpio.h"

//uint16_tn[12]={3,3,140,140,48,48,832,140,832,832,3072,3072};

uint16_tn[12]={3,3,0,0,48,48,0,0,0,0,3072,3072};//预置正确的数据

voidGPIOD_test()//引脚电平检测函数

{

staticuint16_ti,j,a=1,ReadValue,count;//声明静态变量

for(i=0;i<12;i++)//开始进行12次循环

{

GPIO_Write(GPIOD,a);//将a的值写入到GPIOD口

/*GPIOD口读取数据并将值赋给ReadValue*/

ReadValue=GPIO_ReadInputData(GPIOD);

ReadValue=ReadValue&0xfff;//取出ReadValue的低12位

a<<=1;//a每循环一次进行一次左移操作

if(ReadValue==n[i])//判断读取的数据与预置的数据是否相等

{

USART_ClearFlag(USART1,USART_FLAG_TC);//清除发送完成标志位

printf("the%dpointisRight\n",i+1);

}

else//读取到的数据与预置的数据不一致进行本操作

{

ReadValue=n[i]|ReadValue;//************1

ReadValue=ReadValue^n[i];//***********2

/*1、2两步操作是将错误位找到*/

for(j=0;j<12;j++)

{

ReadValue>>=1;//数据右移,将错误位移到最低位

if(ReadValue&1)//判断数据非0

{

USART_ClearFlag(USART1,USART_FLAG_TC);

printf("theerrorpointis%d\n",j+1);

if(i==0||i==1)

{

printf("theerrorislineis1\n");

}

elseif(i==2||i==3||i==7)

{

printf("theerrorislineis2\n");

}

elseif(i==4||i==5)

{

printf("theerrorislineis3\n");

}

elseif(i==6||i==8||i==9)

{

printf("theerrorislineis4\n");

}

elseif(i==10||i==11)

{

printf("theerrorislineis5\n");

}

count++;

}

}

j=0;

}

}

USART_ClearFlag(USART1,USART_FLAG_TC);

printf("thereare%derrors",count);

}

intmain(void)

{

USART1_Config();//串口初始化

GPIOD_Config();//GPIO口初始化

GPIOD_test();//引脚电平检测函数

while

(1);//等待

}

gpio.c

#include"gpio.h"

voidGPIOD_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOD,&GPIO_InitStructure);

}

Gpio.h

#ifndef__GPIO_H_

#define__GPIO_H_

#include"stm32f10x.h"

#include"stm32f10x_usart.h"

voidGPIOD_Config(void);

#endif

usart.c

#include"usart.h"

uint32_ttemp;

voidUSART1_Config(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

USART_InitTypeDefUSART_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA,&GPIO_InitStructure);

USART_InitStructure.USART_BaudRate=115200;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

USART_InitStructure.USART_StopBits=USART_StopBits_1;

USART_InitStructure.USART_Parity=USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;

USART_Init(USART1,&USART_InitStructure);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

USART_Cmd(USART1,ENABLE);

}

voidNVIC_Configuration(void)

{

NVIC_InitTypeDefNVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//ÇÀÕ¼ÓÅÏȼ¶×î¸ß

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

voidUSART1_IRQHandler(void)

{

if(USART_GetITStatus(USART1,USART_IT_RXNE)!

=RESET)

{

temp=USART_ReceiveData(USART1);

USART_SendData(USART1,temp);

while(USART_GetITStatus(USART1,USART_FLAG_TC)!

=RESET);

USART_ClearITPendingBit(USART1,USART_IT_RXNE);

}

}

intfputc(intch,FILE*f)

{

USART_SendData(USART1,(uint8_t)ch);

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

return(ch);

}

intfgetc(FILE*f)

{

while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);

return(int)USART_ReceiveData(USART1);

}

usart.h

#ifndef__USART_H_

#define__USART_H_

#include"stm32f10x.h"

#include"stm32f10x_usart.h"

#include

voidUSART1_Config(void);

voidNVIC_Configuration(void);

voidUSART1_IRQHandler(void);

#endif

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1