台式机的win7 64位系统可以识别u盘,但笔记本的win7 64位却识别不了,说明U盘是可以用的。查看笔记本的设备管理器,发现驱动安装失败,提示信息为“该设备的驱动程序未被安装。 (代码 28) ”。
解决方法:
用“驱动人生”软件检测,并安装驱动。
台式机的win7 64位系统可以识别u盘,但笔记本的win7 64位却识别不了,说明U盘是可以用的。查看笔记本的设备管理器,发现驱动安装失败,提示信息为“该设备的驱动程序未被安装。 (代码 28) ”。
解决方法:
用“驱动人生”软件检测,并安装驱动。
最近,有位用户在升级到 Windows10系统 后,遇到了“该设备的驱动程序未被安装。(代码28)这个设备没有兼容驱动程序”的错误提示,这是怎么回事呢?其实,该问题是由于一些驱动无法通过自动更新来安装(服务端没有匹配的驱动)导致的。下面,小编就介绍下该问题的具体解决方法。
解决方法:
1、安装驱动类软件进行检测并驱动,这方面比较好用的软件有:
驱动精灵,360驱动大师,驱动人生等!
2、查看是什么驱动没有安装好,然后到电脑官方网站下载对应win10系统的驱动并进行安装。基本就可以解决驱动不能通过更新安装的问题,一般驱动人生这类的工具会帮你检测到,或者右键此电脑--管理--设备管理器,有感叹号的设备表示未安装驱动, Win10系统查看驱动是否完全安装 。
PS:目前windows10兼容大部分硬件,并能通过windows更新安装驱动,今后也会越来越兼容所有设备,不过有小部分驱动可能需要自行安装。
Win10系统提示“该设备的驱动程序未被安装。(代码28)”问题的解决方法就介绍到这里了。有需要的朋友,不妨参考一下。更多精彩的内容请继续关注PConline官网
在给单位的一台Server2008R2 X64服务器上安装扫描枪的时候发现无法安装扫描枪驱动,打开设备管理器可以看到扫描枪硬件有黄色叹号标记。错误信息如下:
Windows给出的错误提示很简单,“该设备的驱动程序未被安装。(代码 28)”,就是安装驱动程序有错,但是具体是什么错误,我们从这里是无法得到的。如果以错误提示或者错误代码为关键字上网搜索的话,相信我你一定得不到太多有用的信息。因为之前另外一台win7x64上安装这个扫描枪驱动是没问题的,所以我知道问题不在驱动本身或者硬件设备上。一开始以为是操作系统版本问题,但08r2和win7本来就是差不多的,绕了一些弯路后,还是决定从错误的根源上找原因。
上网搜索后,知道驱动安装会生成系统日志保持在C:\Windows\inf\setupapi.dev.log\setupapi.dev.log中。打开这个日志找到相关日志信息再来分析问题就非常简单了。这是一个非常值得学习的小技巧,log日志远比图形界面提供的错误信息完整并且更有指导意义。如下是setupapi.dev.log中驱动安装时的相关错误信息节选:
inf: Opened INF: 'c:\windows\temp\dmiwu\{de4ae465-6949-463b-9822-287a65fb2b68}\nls_vcp_driver.inf' ([strings])
! inf: Could not find include INF file "layout.inf". Error = 0x00000002
! inf: Unable to load INF: 'C:\Windows\System32\DriverStore\FileRepository\mdmcpq.inf_amd64_neutral_b53453733bd795bc\mdmcpq.inf'(00000003)
! inf: Error 3: The system cannot find the path specified.
! inf: Could not find include INF file "mdmcpq.inf". Error = 0x00000003
相比设备管理器提供的错误信息,这里的日志足够清楚了,安装驱动的时候因为打不开mdmcpq.inf文件所以驱动安装无法继续报错了。上面一行的layout.inf文件经过分析上下文是不影响安装进行的,重要的还是缺少mdmcpq这个东西。找到驱动的安装目录,在这个扫描枪驱动的inf文件中有如下行:
[VCP_DriverInstall.NT]
Include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=VCP_DriverInstall.NT.AddReg
扫描枪的驱动在安装过程中会用到mdmcpq.inf文件,但是安装时候找不到这个文件,所以出错了。
原因找到了缺少依赖驱动,修复就行了,上网直接搜吧,很容易找到一堆关于mdmcpq缺失的问题。同时也会搜到一些无效的方法,比如复制原版的mdmcpq.inf 和 usbser.sys到system32的inf和drivers目录。
但是从日志很明显知道驱动查找的是C:\Windows\System32\DriverStore\FileRepository\目录。所以最好的方法还是从正常的系统中直接复制C:\Windows\System32\DriverStore\FileRepository\mdmcpq.inf_amd64_neutral_b53453733bd795bc目录到故障系统的同位置目录下,如果复制时提示文件夹没有访问权限,给FileRepository目录增加用户权限就行了。
我这里出现故障的系统版本是非原版系统,作者也是小有名气的。但在修改系统过程中难免出现一些隐藏的问题,这种隐藏比较深的故障,对于普通用户来说确实是很难解决的问题。这里非常值得注意的是驱动安装日志用于分析问题的方法,图形化界面虽然友好,但在分析故障原因上有时候的提示太过简化反而变得毫无意义。
命名方式(以28BYJ48步进电机为例)
28BYJ48步进电机的编号
28-----步进电机的有效最大外径是28毫米
B-----表示步进电机
Y-----表示永磁式
J-----表示减速型
48-----表示四相八拍
工作原理
1、五线四相步进电机,不同相位得电会让步进电机的转子转动一个角度,按一定规律给不同的相位通电,就可以让步进电机连续转动,下表就是通电的顺序。
表里面的顺,逆时针的方向只是代表相位给电时序,
注:总共五条线,一个是VCC,剩下四条分别接上ABCD相
分别对应与ULN2003/ULN2003A驱动芯片的5V以及4个输入口对应连接
2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,肯定会引起错误,导致电机堵转或者异常震动。
3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,不断调试到合理范围就行。
4、单片机IO口和电机四条相线连接时,一定不能错误,要按照顺序相连接。
5、调换得电的顺序,就可以控制电机的转向。
注意在51单片机中,为IO口置0相当于是高电平,而置1的时候相当于是低电平,和上面的图片一致(GND)
二、关键实验程序
在编写注释的时候用的是ANSI编码器,在这里部分注释可能会出现乱码,复制到编译器中就会正常显示(也注意一般用UTF-8编码器进行编写,ANSI编码器对中文不友好,一般一个汉字用的2个字符储存,所以在转存的时候就会出现乱码)
头文件
#ifndef __BSP_ULN2003_H__
#define __BSP_ULN2003_H__
#include <stm32f10x.h>
#include "bsp_SysTick.h"
#define STEPPER_ANGLE 0.703125 // 360/(4096/4)=360/512=0.703125
enum dir{Pos, Neg}; //Pos = 0, Neg = 1 //enumΪ¶¨ÒåΪö¾Ù
#define IN1_HIGH GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET)
#define IN1_LOW GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET)
#define IN2_HIGH GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET)
#define IN2_LOW GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET)
#define IN3_HIGH GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_SET)
#define IN3_LOW GPIO_WriteBit(GPIOA, GPIO_Pin_6, Bit_RESET)
#define IN4_HIGH GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET)
#define IN4_LOW GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET)
void ULN2003_Configuration(void);
void stepper(unsigned int dir, unsigned int speed);
void angle_control(unsigned int dir, double angle, unsigned int speed);
#endif
调用函数
/*
Á¬Ïß±í£º
STM32 ULN2003Çý¶¯
PA4 <-------> IN1
PA5 <-------> IN2
PA6 <-------> IN3
PA7 <-------> IN4
5V 28BYJ-48²½½øµç»ú£¬ÄÚ²¿´øÓмõËÙ×°Öà ¼õËٱȣº1/64 ²½¾à½Ç£º5.625¡ã/64£¨64¸öÂö³åת¶¯5.625¡ã£©
ÕýÏòת¶¯£º
ËÄÏà°ËÅÄ¿ØÖÆË³Ðò£º(A-AB-B-BC-C-CD-D-DA)
1 2 3 4 5 6 7 8
A - - + + + + + -
B + - - - + + + +
C + + + - - - + +
D + + + + + - - -
·´Ïòת¶¯£º(DA-D-CD-C-BC-B-AB-A)
*/
#include "bsp_uln2003.h"
void ULN2003_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET);
}
//ËÙ¶È¿ØÖÆ:
/*
dir: ˳£¬ÄæÊ±ÕëÐýת·½Ïò
speed£º×ªËÙ£¬·¶Î§[1,100]
*/
void stepper(unsigned int dir, unsigned int speed)
{
if(dir == Pos)
{
//step1:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step2:
IN1_HIGH;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step3:
IN1_LOW;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step4:
IN1_LOW;
IN2_HIGH;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step5:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step6:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_HIGH;
Delay_us(speed);
//step7:
IN1_LOW;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
//step8:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
}
else
{
//step1:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
//step2:
IN1_LOW;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
//step3:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_HIGH;
Delay_us(speed);
//step4:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step5:
IN1_LOW;
IN2_HIGH;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step6:
IN1_LOW;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step7:
IN1_HIGH;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step8:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
}
}
//½Ç¶È¿ØÖÆ£º
/*
dir: ˳£¬ÄæÊ±ÕëÐýת·½Ïò
angle£º½Ç¶È£¬·¶Î§[0,360]
speed£º×ªËÙ£¬·¶Î§[1,100]
*/
void angle_control(unsigned int dir, double angle, unsigned int speed)
{
int i;
for(i = 0; i < angle / STEPPER_ANGLE; i++) //µ÷ÓÃ(angle / STEPPER_ANGLE)¸ö°ËÅÄ
stepper(dir, speed);
}
//µ÷ÓÃÕâ¸öº¯Êý¿ØÖƽǶÈÓнÏСµÄÎó²î»ò˵ÊÇȱÏÝ£ºÒ»ÊÇ˵stepper(dir, speed);ÊÇÒÔ°ËÅÄΪ×îС·Ö¶ÈÖµ
//Æä´ÎÊÇ£¬forº¯ÊýÖÐ×îС²½¾àΪ1£¬ºÜÏÔÈ»angle / STEPPER_ANGLE ×î¶àÓÐÒ»¸ö°ËÅĵÄÎó²î£¬
//¼´5.624/64*8=0.703¶È£¬Ò²²»ÊǺܴ󣬿ÉÒÔºöÂÔ²»¼Æ
1、步进电机的减速比为1/64,即转子转动64圈,外面的转轴才会转动1圈
2、步进电机的步距角为5.624/64 (步进电机的定子绕组每次改变一次通电状态,步进电机外面的转轴转过的角度称步距角;即步进电机的最小旋转角度)
3、所以360/(5.624/64)≈ 4096 (步进电机外面的转轴转过一圈所需要改变定子绕组的通电状态次数)
这里补充介绍一个概念:步进角
步进电机的定子绕组每次改变一次通电状态,转子转过的角度称步进角。
(可以认为是电机内部的转子的最小旋转角度)
步进角 = (360)/m * Z * C
m-----定子相数
Z-----转子磁极对数
C-----通电方式
{ C = 1 ,单相轮流通电,双相轮流通电方式
C = 2 , 双相轮流通电方式
1,相数:是指产生不同对极N,S磁场的激磁线圈对数
2,拍数:完成一个周期性变化所需脉冲数,以四相电机为例,有单相四拍的运行方式:(A-B-C-D),有双相四拍的运行方式:(AB-BC-CD-DA),有四相八拍的运行方式:(A-AB-B-BC-C-CD-D-DA)
这里的源码用的是双相轮流通电方式,在源码中可以看到四个相位MA,MB,MC,MD使能为高电平状态的相位数为相邻2个或1个(A-AB-B-BC-C-CD-D-DA)
步进电机的相关参数:
注意事项:由于电机的制造误差,安装误差,单片机的误差还有软件延时函数误差,这些误差累加起来之后,就会导致电机的转速、转动角度出现一定的误差。