2019-04-13 17:07:12 qq_38093011 阅读数 111
  • 直流电机和步进电机-第1季第12部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第12个课程,主要讲解了直流电机和步进电机,其中步进电机是关键,通过学习让大家初步掌握步进电机相关的概念和时序,能够将时序转化为驱动程序以驱动步进电机。

    2674 人正在学习 去看看 朱有鹏

单片机的pwm信号线与电机光耦隔离,但有时会出现单片机重启现象(在发生碰撞或其他负载较大变化时)。起初猜想电池容量放店倍率不够导致电机重启,故采取分立供电,但效果不明显,不过换24(原12v)电池和相应的驱动后得到明显改善。但问题依旧存在,寻迹模块使用异常,不过灰度模块可以正常使用。
又猜想电机电流产生较大的变化时,会有电流浪涌或高次谐波现象,所以打算用共模电感来消除干扰。或者采用RC低通滤波来减少干扰。但此上还未尝试,尝试后继续来写原因及总结。

2014-04-11 13:28:40 zcj331 阅读数 8214
  • 直流电机和步进电机-第1季第12部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第12个课程,主要讲解了直流电机和步进电机,其中步进电机是关键,通过学习让大家初步掌握步进电机相关的概念和时序,能够将时序转化为驱动程序以驱动步进电机。

    2674 人正在学习 去看看 朱有鹏
      

 本文以500ms为开关最高开闭时间,介绍一种既能用交流供电又能用电池供电的电源电路。该电源电路供电能力约为1W。该电源电路在正常情况下可用交流供电。用市售的听单放机的小变压器即可。从电源插孔DC拔出小变压器插头则电路自动由电池供电,插上插头则自动由交流供电。若电源电流不足,则可修改T1三极管为复合三极管,以扩大其供电电流的能力。

  一般在单片机系统功率不大的情况下,本电路可满足要求,且电路结构简单,易于自制。交直流电源供电的自动转换原理:购买变压器时,应使其额定直流电压大于等于电池电压的1.1倍。一般单节干电池的电压新用时电压大干1.5V,约为1.65V左右。干电池在使用过程中电池端电压逐渐下降,内阻逐渐增大,直至电池报废。本电源电路在交直流电源同时有电时,由于交流电源电压高于直流电压使二极管D不导通,电路由交流供电。如交流电源无电或电压低,则二极管D自动导通,负载由电池供电。

  本电路在合上开关K后,后续电路可延时约0.5s,以躲过电源开关的闭合时间(包括触点颤抖时间).并可在小于Ims的时间内建立电压。以保证上电复位需要。电路图如上图所示。

  图中由R1、C2、R2、R3、U1组成电容充电延时回路。R1、C2为电容充电回路,R2、R3电阻决定B点基准比较电压.U1为比较器。R4是为了提高Ul的跳变时间而加的反馈电阻。Ul的跳变时间即是电路电压建立时间。开关K合上后,电源通过Rl为C2充电。此时C2的端电压(即A点电压)由0逐渐上升。A点电压上升至B点电压(即由R2、R3确定的基准比较电压)时,U1跳变输出低电平。C1为电源稳压电容。

  C3、C4为抗干扰电容,C3用于抗低频干扰,C4用于抗高频干扰。Cl、C2、C3可选电解电容。C4则选瓷片电容、云母电容等高频电容。C4的取值范围在0.01-0.1 u F之间任一值皆可。电源的本身功耗主要集中于T2,且随着输入电压升高而增大。T1由于管压降只有0.4V左右,所以管耗较低。T1为开关管,它的管耗不随输入电压的变化而变化,只与电源的输出电流有关。元器件选择见电路元器件表。

  对原理图而言,在印制板图中没有电源插孔DC、整流二极管D、电池BATTERY和开关K,多了IN和OUT两个接插件。其中JN插座插从开关K处输入的电源插头.OUT插座插输出给单片机系统的电源插头。原理图中的其余元件则固定在电路板外的电源盒上,电路由接插件连接。下图是印制板电路图。

  在制作电路时,要注意开关K的选择,一般地说拿起开关,合上时能听到“卡嗒”,一声,“卡嗒”声清脆则表示开关中的弹簧有力,可保证开关合上的时间远小于0.5s。电池组电压应在7~18V之间。四节干电池的额定电压为6V.故如用干电池供电则应用五节干电池。除去T1、T2、D共不到2V的管压降后,电池仍可向单片机系统正常供电。

  若要加大电路的输出电流,要修改T1三极管。当输出电流增大或电源输入电压较高时,视情况应为T2加装散热片。同时也要考虑电池的供电能力。此电路最好与单片机控制系统做在一起而不是作单独的电源使用。

  此电路结构简单,无需调试,适用场合广,元器件的通用性好,对元器件质量要求不高,是单片机爱好者自制单片机控制系统时的好帮手。

2019-04-22 10:35:14 zy19981110 阅读数 1238
  • 直流电机和步进电机-第1季第12部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第12个课程,主要讲解了直流电机和步进电机,其中步进电机是关键,通过学习让大家初步掌握步进电机相关的概念和时序,能够将时序转化为驱动程序以驱动步进电机。

    2674 人正在学习 去看看 朱有鹏

这个程序是以前比赛时候准备的,方便用来调电机转速,也可作呼吸灯等。采用的是mx1508数字芯片作为直流电机驱动板,可双路输出。感觉比纯模拟电路的mos管好用还便宜。

IN1和IN2是控制端(电机A) ,控制高低电平可以来控制正反转。没有调速端口。一个方案是在供电端给不同pwm进行调速,可io供电能力有限,速度可能会慢。所以另一个方案就是一个输入端口给pwm,改变电平;另一端输入口给固定电平就可以进行调速。

 

 

stc12c5a60s2内部有2个pwm输出io口。根据芯片手册可知。

具体寄存器配置请多多自行参照手册。学会理解别人代码进行自学。这样才能进步。我记得这个pwm模块程序也是我上网查改的。

#include <STC12C5A60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void pwm_init() //PWM初始化函数,初始占空比为0
{
	CMOD=0x02;	//0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512
	CL=0x00;
	CH=0x00;
	CCAPM0=0x42; //0100 0010, 8位 PWM
	CCAP0L=0x00;
	CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平
	CCAPM1=0x42;
	CCAP1H=0x00;
	CCAP1L=0x00;
	CR = 1;	  //开启PCA计数器
}
void pwm_set(uchar x,uchar y) //占空比设置函数   引脚为P1.3和P1.4
{
		CCAP0H=x*2.55;    //占空比公式D=(256-CCAPnH)/ 256(8位PWM模式)
		CCAP0L=x*2.55;		//乘2.55转换为0-100%
		CCAP1H=y*2.55;
		CCAP1L=y*2.55;
}
void main()
{
	pwm_init();
	while(1)
	{
	pwm_set(0,20);    //数值反放则电机方向反转 (20,0);
	}
}

 这里还有一篇《利用单片机内部定时器产生pwm进行led呼吸灯调光》:https://blog.csdn.net/zy19981110/article/details/89447173

2019-09-02 14:32:57 ab6326795 阅读数 407
  • 直流电机和步进电机-第1季第12部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第12个课程,主要讲解了直流电机和步进电机,其中步进电机是关键,通过学习让大家初步掌握步进电机相关的概念和时序,能够将时序转化为驱动程序以驱动步进电机。

    2674 人正在学习 去看看 朱有鹏

参考1:

用4接1.5V电池供电,然后在输出端加一个普通的二极管,这样的话,出来的电压应该是5.2V左右,单片机完全可以正常工作。用LM7805不行,因为7805稳压的条件是稳压值和供电电压的压差在2.5V以上效果比较好,但是最差不能低于2V。用5节1.5V的话,可以加7805稳压,但是这完全没必要,经济上不划算。我建议你直接买9V电池,2块钱一节的,我用过,电量还不错,再用7805稳压芯片降到5V,就可以给单片机供电了!
 

单片机如何外部供电

单片机供电一般的单片机为5V,有的为3.3V,大多数不会太高。
供电时为了降低干扰,一般在电源引脚附近加上一104的瓷片电容和一个小电解电容。
 

3.3V单片机,如何与5V供电的外围器件通讯?

3.3V-5V系统之间的信号连接需要解决电平匹配的问题(具体需要你查一下两个系统涉及到元器件的输入输出高低电平的阀值),简单的接法如下:
1.信号由3.3V侧输出:需要提高高电平电压,通常用HCT型的门电路即可,单路的可TI单个门电路产品;
2.信号由5V侧输出:需要明确3.3V侧器件的耐压是否能承受5V,一般用一个20-30欧姆的电阻串入,降压限流。

版权声明:本文为CSDN博主「cy941228」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cy941228/article/details/52627039

----------------------------------------------------------------------------------------------

参考2:

1、可以用专门的电源管理芯片 

2、根据数据手册,stc89c52rc单片机工作电压:5.5V~3.8V(5V单片机)/3.8V~2.4V(3V单片机),所以供电可以2节1.5V电池(3V单片机)或者3节1.5v电池(5V单片机),但要选择小于等于24MHz的外部晶振。

3、最好使用一个合适的开关电源降压供电

4、建议用18650电池,一节也可以,二节也可以,18650到5v的模块很好找,效率也不错,性能也不错

5、用18650动力电池好点。简单的话加LDO,高效率可以用DCDC

6、用二极管,还是需要稳压的

7、7805,简单又便宜。

8、串两个二极管是可以的,或者串电阻并个稳压二极管也可以

9、推荐用7805稳压模块,电池用可充电的电池节省成本。

10、根据压差选择,建议使用LM1117-5.0稳压给单片机。

11、做一个电源电路的(电源模块)

12、用锂电池加一个稳压模块

13、小车的话,用充电电池吧,转电压的话还是选一些稳压器吧,电源稳定,纹波也可以按要求降低

14、你不止要考虑降压,还一定要考虑稳压!!我最近刚刚做了一个遥控车,和你很类似,我用的是电池,四节电池,然后用了一个稳压管,来降压给单片机供电,电机和单片机并联,但是我出现了一个问题,电机一启动,单片机就会被复位,后来检查发现了,电机启动的瞬间,单片机的供电电压突降,之后又回升,所以这就导致了单片机重启。最后我认为的原因是电机在给电,但还没转起来的时候,电机此时的等效电阻最小,因为还没有动能的转化,所以导致外部负载整体电阻变小很多,所以电流变大,电池内阻占了大部分电压,导致单片机电压瞬间降低。解决办法也很简单,用一个电容并联在电路里面滤波就可以了。或者还有一个蠢办法就是给和电机串联一个小电阻,这样会减小电流,但是也会降低转速。

https://bbs.csdn.net/topics/392460868

----------------------------------------------------------------------------------------------

参考3:

(1) 晶体管+上拉电阻法
  就是一个双极型三极管或 MOSFET,C/D极接一个上拉电阻到正电源,输入电平很灵活,输出电平大致就是正电源电平。

(2) OC/OD 器件+上拉电阻法
  跟 1) 类似。适用于器件输出刚好为 OC/OD 的场合。

(3) 74xHCT系列芯片升压 (3.3V→5V)
  凡是输入与 5V TTL 电平兼容的 5V CMOS 器件都可以用作 3.3V→5V 电平转换。
  ——这是由于 3.3V CMOS 的电平刚好和5V TTL电平兼容(巧合),而 CMOS 的输出电平总是接近电源电平的。
  廉价的选择如 74xHCT(HCT/AHCT/VHCT/AHCT1G/VHCT1G/...) 系列 (那个字母 T 就表示 TTL 兼容)。

(4) 超限输入降压法 (5V→3.3V, 3.3V→1.8V, ...)
  凡是允许输入电平超过电源的逻辑器件,都可以用作降低电平。
  这里的"超限"是指超过电源,许多较古老的器件都不允许输入电压超过电源,但越来越多的新器件取消了这个限制 (改变了输入级保护电路)。
  例如,74AHC/VHC 系列芯片,其 datasheets 明确注明"输入电压范围为0~5.5V",如果采用 3.3V 供电,就可以实现 5V→3.3V 电平转换。  

(5) 专用电平转换芯片
  最著名的就是 164245,不仅可以用作升压/降压,而且允许两边电源不同步。这是最通用的电平转换方案,但是也是很昂贵的 (俺前不久买还是¥45/片,虽是零售,也贵的吓人),因此若非必要,最好用前两个方案。

(6) 电阻分压法
  最简单的降低电平的方法。5V电平,经1.6k+3.3k电阻分压,就是3.3V。

(7) 限流电阻法
  如果嫌上面的两个电阻太多,有时还可以只串联一个限流电阻。某些芯片虽然原则上不允许输入电平超过电源,但只要串联一个限流电阻,保证输入保护电流不超过极限(如 74HC 系列为 20mA),仍然是安全的。

(8) 无为而无不为法
  只要掌握了电平兼容的规律。某些场合,根本就不需要特别的转换。例如,电路中用到了某种 5V 逻辑器件,其输入是 3.3V 电平,只要在选择器件时选择输入为 TTL 兼容的,就不需要任何转换,这相当于隐含适用了方法3)。

(9) 比较器法
  算是凑数,有人提出用这个而已,还有什么运放法就太恶搞了。

2. 电平转换的"五要素"

(1) 电平兼容
  解决电平转换问题,最根本的就是要解决逻辑器件接口的电平兼容问题。而电平兼容原则就两条:
  VOH > VIH
  VOL < VIL
  再简单不过了!当然,考虑抗干扰能力,还必须有一定的噪声容限:
  |VOH-VIH| > VN+
  |VOL-VIL| > VN-
  其中,VN+和VN-表示正负噪声容限。
  只要掌握这个原则,熟悉各类器件的输入输出特性,可以很自然地找到合理方案,如前面的方案(3)(4)都是正确利用器件输入特性的例子。

(2) 电源次序
  多电源系统必须注意的问题。某些器件不允许输入电平超过电源,如果没有电源时就加上输入,很可能损坏芯片。这种场合性能最好的办法可能就是方案(5)——164245。如果速度允许,方案(1)(7)也可以考虑。

(3) 速度/频率
  某些转换方式影响工作速度,所以必须注意。像方案(1)(2)(6)(7),由于电阻的存在,通过电阻给负载电容充电,必然会影响信号跳沿速度。为了提高速度,就必须减小电阻,这又会造成功耗上升。这种场合方案(3)(4)是比较理想的。

(4) 输出驱动能力
  如果需要一定的电流驱动能力,方案(1)(2)(6)(7)就都成问题了。这一条跟上一条其实是一致的,因为速度问题的关键就是对负载电容的充电能力。 

2018-05-18 23:55:02 qrsxtkf 阅读数 10070
  • 直流电机和步进电机-第1季第12部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第12个课程,主要讲解了直流电机和步进电机,其中步进电机是关键,通过学习让大家初步掌握步进电机相关的概念和时序,能够将时序转化为驱动程序以驱动步进电机。

    2674 人正在学习 去看看 朱有鹏

要做一个51单片机循迹智能小车,首先你要会单片机编程,会使用keil软件,有单片机编程的经验,因为这样你才能用程序去控制小车。

硬件部分:(1)在淘宝上买一个小车架子,包括:车轮、电机。

(2)电机驱动:L298N,有现成的模块,可以驱动两个电机

(3)电源:买12V的锂电池,可以直接给电机供电,再买一个LM7805稳压芯片,得到的5V可以给单片机供电,当然Lm7805的5V端口也能提供输出5V,但是,一本用稳压的。

(4)转向舵机:舵机控制用PWM波形,就是脉冲,高低电平的不同时间,产生用单片机的管脚模拟输出pwm波形,控制舵机转向。

(5)循迹模块:TRCT5000集成模块,将输出接到单片机管脚上即可,用查询方式检测,编程控制电机、舵机。

软件部分:

(建议各位用模块化编程的形式,建立多个c文件以及对应的头文件,主函数中直接调用函数即可,不要把所有的程序写在主函数中。)

避障的头文件:

#ifndef _BIZHANG1_H
#define _BIZHANG1_H


#include<reg52.h>


sbit bizhangzuo=P0^0;
sbit bizhangyou=P0^1;




sbit en1=P3^2;
sbit IN1=P3^3;
sbit IN2=P3^4;
sbit en2=P3^5;
sbit IN3=P3^6;
sbit IN4=P3^7;




void tingzhi();
void qianjin();
void zuozhuan();
void youzhuan();
void houtui();


void bizhang();
void initt1_dianji();

 

#endif/*_BIZHANG1_H*/

 

避障的C文件(注意:有C文件,就有一个对应的头文件)

#include<bizhang1.h>   //把头文件包含进来
#include<reg52.h>


extern unsigned int count;
extern unsigned char jd;
unsigned char zkb1=0;
unsigned char zkb2=0;
unsigned char timer1=0;




/*******为了产生PWM波来控制电机的速度***********/
void initt1_dianji()
{
TMOD= 0x10; 
TH1 =(65536-800)/256; //--定时器赋初始值,12MHZ下定时0.8ms--//  
TL1 =(65536-800)%256; 
    ET1 = 1;
EA = 1;
TR1 = 1;
}


void Time1(void) interrupt 3
{
TH1 =(65536-800)/256; //重新赋值  
TL1 =(65536-800)%256; 
timer1++;
           // 0.8ms次数加1
while(timer1>100)  //PWM周期为100*0.8ms=80ms
{
timer1=0;
}


if(timer1 <zkb1) //改变zkb1值可以改变直流电机的速度
{
en1=1;
}
else
{
en1=0;
}
if(timer1 <zkb2) //改变zkb2这个值可以改变直流电机的速度
{
en2=1;
}
else
{
en2=0;
}
}


void qianjin()
    {
IN1=1;
IN2=0;
IN3=1;
IN4=0;
zkb1=30;
zkb2=30;
}


void zuozhuan() //左转函数
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
zkb1=30;
zkb2=30;
}


void youzhuan()//右转函数
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
zkb1=30;
zkb2=30;
}


void houtui()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
zkb1=30;
zkb2=30;
}


void bizhang()
{
    if(bizhangzuo==0&&bizhangyou==1) //遇到障碍物,接收到返回光为低电平
{
youzhuan();
        }

if(bizhangzuo==1&&bizhangyou==0)
{
  zuozhuan();
}
if(bizhangzuo==0&&bizhangyou==0)
{
houtui();
}
if(bizhangzuo==1&&bizhangyou==1)
{  
qianjin();
}

}   

 

控制舵机的头文件:

#ifndef _DUOJICESHI_H
#define _DUOJICESHI_H


#include<reg52.h>
#include<duojiceshi.h>


void initt0_duoji();


void duojikongzhi();
void huizheng();
void you();
void zuo();


sbit PWM=P2^0;

 

#endif/*_DUOJICESHI_H*/

控制舵机的C文件

#include<duojiceshi.h>
#include<bizhang1.h>
#include<reg52.h>


unsigned int count;
unsigned char jd;   //角度表示,1对应于-90度,2~-45度,3~90度(回正)。


 void initt0_duoji()
 {
  TMOD=0x01;
    TH0=0xfe;  //11.0592mhz,对应定时0.5ms
    TL0=0x33;
EA=1;
ET0=1;
TR0=1;
 }


 void timer0()interrupt 1
 {
  TH0=0xfe;  //11.0592mhz,对应定时0.5ms
  TL0=0x33;
  count++;
if(count<jd)
PWM=1;
else
PWM=0;
if(count==40)  //40*0.5ms=20ms
  count=0; //20ms周期重新开始
}


void duojikongzhi()

if(bizhangzuo==0&&bizhangyou==1)   //接收到返回光,为低电平                                  
{
you();
while(bizhangzuo==0&&bizhangyou==1); //等待改变
}


if(bizhangzuo==1&&bizhangyou==1)                                  
{
huizheng();
while(bizhangzuo==1&&bizhangyou==1);
}


if(bizhangzuo==1&&bizhangyou==0)
{
    zuo();
while(bizhangzuo==1&&bizhangyou==0);
}
}
 
void huizheng()
{
jd=3;
count=0;
}
void zuo()
{
jd=4;
count=0;
}
void you()
{
jd=2;
count=0;

}

 

主函数:

#include<reg52.h>
#include<bizhang1.h>
#include<duojiceshi.h>


extern unsigned int count;
extern unsigned char jd;




void main()
{
  initt0_duoji();
  initt1_dianji();
  huizheng();


  while(1)
{
 duojikongzhi();
 bizhang();
}
}

 

 

 

 

51单片机蓝牙小车

阅读数 3618

没有更多推荐了,返回首页