线路检测报告.docx
- 文档编号:9965095
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:18
- 大小:332.21KB
线路检测报告.docx
《线路检测报告.docx》由会员分享,可在线阅读,更多相关《线路检测报告.docx(18页珍藏版)》请在冰豆网上搜索。
线路检测报告
二级项目(嵌入式系统应用)
题目:
基于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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线路 检测 报告