直流电机脉宽调速

发布者:dswecd最新更新时间:2015-02-05 来源: 51hei关键字:直流电机  脉宽调速  PIC16F877A 手机看文章 扫描二维码
随时随地手机看文章

测试环境:MPLAB IDE v8.73
测试芯片:PIC16F877A
所需器件:


PIC16F877A单片机最小系统板
 

L298N电机驱动模块


4P杜邦线


最终的主要的电路实物连接图


最终测试图



电路连接图:
 对应程序一的电路原理图[page]

程序一:简单实现两个电机的正反转,未加调速。
#include       //调用头文件,可以去PICC软件下去查找PIC16F87XA单片机的头文件
__CONFIG(XT&WDTDIS&LVPDIS);    //定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程
/*宏定义区*/
#define IN1 RB7//Left Motor
#define IN2 RB6//Left Motor
#define IN3 RB5//Right Motor
#define IN4 RB4//Right Motor
/*相关函数声明部分*/
void delay_ms(unsigned int ms);//声明延时函数
void IO_Config(void);//声明IO配置函数
void Motor_Go_Forward(void);//声明前进函数
void Motor_Go_Back(void);//声明后退函数
void Motor_Turn_Left(void);//声明左转函数
void Motor_Turn_Right(void);//声明右转函数
//-----------------------------------------
//Name: 系统主函数  
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void main(void)
{
     IO_Config();//调用IO配置函数
     while(1)
    {
        Motor_Go_Forward();//小车前进
        Motor_Go_Back();//小车后退
        Motor_Turn_Right();//小车右转
        Motor_Turn_Left();//小车左转
    }
}
//-----------------------------------------
//Name: 延时函数
//Description:to delay time  
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
void delay_ms(unsigned int ms)
{
 while(--ms);
}
//-----------------------------------------
//Name: IO配置函数 
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void IO_Config(void){
 TRISA = 0B11111111;  //RA0-RA7设置为输入
 TRISB = 0B00001111;  //RB0-RB3设置为输入,RB4-RB7设置为输出
 TRISC = 0B00000000;  //RC0-RC7设置为输出
 TRISD = 0B00000000;  //RD0-RD7设置为输出
 PORTB = 0B00000000;  //RB初始化输出或输入低电平 
 PORTC = 0B00000000;  //RC初始化输出低电平
 PORTD = 0B00000000;  //RD初始化输出低电平
 
}
//-----------------------------------------
//Name: 前进函数 
//Description:Left Motor↑ Right Motor↓ 
//Created By: xd
//Email: 58969288@qq.com
//Date: 20104-04-05
//-----------------------------------------
void Motor_Go_Forward(void){
 IN1 = 0;
 IN2 = 1;
 IN3 = 0;
 IN4 = 1; 
}
//-----------------------------------------
//Name: 后退函数 
//Description:Left Motor↓ Right Motor↓ 
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void Motor_Go_Back(void){
 IN1 = 1;
 IN2 = 0;
 IN3 = 1;
 IN4 = 0; 
}
//-----------------------------------------
//Name: 右转函数
//Description:Left Motor↑ Right Motor↓  
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void Motor_Turn_Right(void){
 IN1 = 1;
 IN2 = 0;
 IN3 = 0;
 IN4 = 1; 
}
//-----------------------------------------
//Name: 左转函数 
//Description:Left Motor↓ Right Motor↑ 
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void Motor_Turn_Left(void){
 IN1 = 0;
 IN2 = 1;
 IN3 = 1;
 IN4 = 0; 
}
 
程序二:可以实现直流电机的调速,这里在上面的原理基础上,将L298N模块的ENA和ENB连接的短接冒拔下来,将ENA接在RC1上,ENB接在RC2上。
#include //调用头文件
__CONFIG(XT & WDTDIS & LVPDIS);//定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程
/*宏定义区*/
#define IN1 RB7//Left Motor,L298N模块的IN1
#define IN2 RB6//Left Motor,L298N模块的IN1
#define IN3 RB5//Right Motor,L298N模块的IN1
#define IN4 RB4//Right Motor,L298N模块的IN1
 
/*相关函数声明部分*/
void IO_Config(void);//声明IO配置函数
void PWM_Init(void);//声明PWM初始化函数
void Motor_Speed_Config(unsigned char PWM1,unsigned char PWM2);//声明电机速度调节函数
//-----------------------------------------
//Name: 系统主函数  
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void main(void)            //主函数,单片机开机后就是从这个函数开始运行
{
IO_Config();//调用IO端口配置函数
PWM_Init();//调用PWM初始化函数
while(1)               //死循环,单片机初始化后,将一直运行这个死循环
{
//占空比为0%      --传的实参为0
//占空比为20%    --传的实参为20
//占空比为40%    --传的实参为40
//占空比为60%    --传的实参为60
//占空比为80%    --传的实参为80
//占空比为100%  --传的实参为100
 
//当调用void Motor_Speed_Config(unsigned char PWM1,unsigned char PWM2)
//时传入的两个参数如果相等的话,左右电机将获得相同占空比的PWM信号,此时小
//可以前进或者后退;当传入的两个参数不相等的话,那么左右电机将获得不同占空比
//的PWM,获得的速度也就会不一样,这样就会实现小车的左转或右转的效果,当
//占空比设置为0时,小车的左右电机停止转动,可以实现小车停车效果
Motor_Speed_Config(100,100);
}
}
//-----------------------------------------
//Name: PWM初始化函数  
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void PWM_Init(void){
//PWM周期 = (PR2 + 1) * 4 * Tosc * (TMR2预分频值)
//PWM频率 = 1/【PWM周期】
//其中Tosc这里为4MHz,TMR2预分频值下面设置的为1
CCP1CON = 0B00001100; //设置CCP1为PWM模式,PWM占空比bit1:0,bit0:0;
CCP2CON = 0B00001100; //设置CCP2为PWM模式,PWM占空比bit1:0,bit0:0;
PR2 = 99;//频频:10.000KHZ周期:0.0001s
 
/*T2CKPS1:T2CKPS0:TMR2时钟预分频选择位*/
/*0 0 = 预分频值为1*/
/*0 1 = 预分频值为4*/
/*1 x = 预分频值为16*/
T2CKPS1 = 0;
T2CKPS0 = 0;//前分频为1:1
TMR2IF = 0;//清零PIR1寄存器中的TMR2IF中断标志位
TMR2ON = 1;//启动TIMER2
//PWM占空比 = (CCPRxL:CCPxCON<5:4>) * Tosc * (TMR2预分频值)   
CCPR1L = 0;//占空比初始值为0
CCPR2L = 0;//占空比初始值为0
//这里具体说明下占空比的计算方法:例如要设置占空比为80%,这里PWM
//周期设置为0.0001s,0.0001 * 80% = x * 1/4MHz * 1
//计算得到x = 320,因为CCP1CON = 0B00001100或者CCP2CON = 0B00001100;
//这么设置的,那么PWM占空比的bit1:0,bit0:0;CCPR1L或CCPR2L为其bit9-bit2,
//所以写入CCPR1L或CCPR2L中的值为320除以4等于80,即输出占空比为80%的PWM信号
//就往CCPR1L或CCPR2L中写入80,这样在RC1或RC2引脚上就可以输出相应占空比的
//的PWM信号,设置PWM频率为10KHz,有个好处就是,这里计算占空比很容易,设置
 
//占空比的数值和写入CCPR1L或CCPR2L中的值一样
/*T2CKPS1:T2CKPS0:TMR2时钟预分频选择位*/
/*0 0 = 预分频值为1*/
/*0 1 = 预分频值为4*/
 /*1 x = 预分频值为16*/
 T2CKPS1 = 0;
 T2CKPS0 = 0;//前分频为1:1
 TMR2IF = 0;//清零PIR1寄存器中的TMR2IF中断标志位
 TMR2ON = 1;//启动TIMER2
}
//-----------------------------------------
//Name: IO配置函数 
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void IO_Config(void){
TRISA = 0B11111111;       //RA0-RA7设置为输入
TRISB = 0B00001111;    //RB0-RB3设置为输入,RB4-RB7设置为输出
TRISC = 0B00000000;    //RC0-RC7设置为输出
TRISD = 0B00000000;    //RD0-RD7设置为输出
PORTB = 0B00000000;  //RB初始化输出或输入低电平 
PORTC = 0B00000000;  //RC初始化输出低电平
PORTD = 0B00000000;  //RD初始化输出低电平
}
//-----------------------------------------
//Name: 电机速度调节函数 
//Description: 
//Created By: xd
//Email: 58969288@qq.com
//Date: 2014-04-05
//-----------------------------------------
void Motor_Speed_Config(unsigned char PWM1,unsigned char PWM2){
CCPR1L = PWM1;
IN1 = 0;
IN2 = 1;
CCPR2L = PWM2;
IN3 = 0;
IN4 = 1; 
}
关键字:直流电机  脉宽调速  PIC16F877A 引用地址:直流电机脉宽调速

上一篇:PIC16C54单片机简单例程
下一篇:基于PIC的太阳能与市电互补照明系统控制器设计

推荐阅读最新更新时间:2024-03-16 13:53

有刷和无刷直流电机的区别
我永远不会忘记我的第一个涉及电机的项目。 我在小学时为一个科学项目建造了一个小型电梯。当然,它在测试阶段工作得很好,但在计算时却失败了。我用木头建造了电梯井架,并使用了带绳索的滑轮系统来上下提升纸板箱。(这是在我学习齿轮/滑轮比之前,所以我的电梯更像是一个弹射座椅而不是电梯。) 对于运动控制,我在我的项目中使用了电池、开关和直流电机。长话短说 - 因为我太专注于测试,我的电池实际上在演示之前就没电了。事后看来,我应该在演示之前更换电池。老师仍然给了我一个不错的分数,因为有人目睹了电梯的工作并为我担保。 那是我第一次接触直流电机。你能猜出我用的是哪种直流电机吗? 直流电机的类型 有两种类型的直流电机 - 有刷和无刷。它们都是
[嵌入式]
有刷和无刷<font color='red'>直流电机</font>的区别
报警器监视直流电机的转速
可利用图1中的电路来监视直流风扇电机的转速,并且如果电机停转就报警。该电路的一种潜在应用是监视PC中的CPU风扇速度,CPU过热可能会毁坏整个系统。PC BIOS对引导期间的CPU或机箱风扇速度的监视能力通常很有限。而且,如果启用BIOS的CPU风扇保护功能,它可能很快就会出问题:如果风扇的起动加速度减慢,则BIOS会在引导序列的开始就把PC断电,使用户无法进入BIOS设置来纠正这一情况。因此,手册经常建议用户禁用这项风扇功能。图1中的电路表明如何实施连续监视,并且在出现风扇问题时报警,并自动使系统断电。   R1上的脉冲是由风扇的无刷电机换向引起的,它起动施密特触发器Q1/Q2,后者控制晶体管开关Q3,使风扇的主板
[嵌入式]
STM32直流电机启动(一)驱动电路的介绍
驱动电路 典型的H桥驱动电路如下: 要使电机旋转只需导通对角线上的两个三极管即可,如导通Q1,Q4,关闭Q2,Q4即可驱动电机正转; 若想电机反向转动,即导通三极管Q2,Q3,关闭Q1,Q4。 此时电路图可简化为如下所示: 但当我们直接导通一个半桥上的Q1,Q3(或Q2,Q4)时,电源被短接,由于三极管电阻很小,此时流过三极管的电流很大,非常容易烧坏三极管,因此实际运用中一定不能导通同一个半桥上的三极管。 但是在实际情况中,三极管导通/关闭和电路中的其它原件操作都存在一定延时的,因此不能简单的认为,只需要同时将Q1,Q4导通,Q2,Q3关闭即可驱动电机; 为避免上述情况的发生,一般有如下两种方式: 1.硬件上采
[单片机]
单相普通直流调速如何适配直流电机
单相普通直流调速器适配直流电机时有以下几种情况: 1.国内普通的Z2直流电机基本都是前苏联的设计标准,即电枢2组线圈 串接为DC220V,磁场1组线圈为DC220V,常规转速1500转/分; 2.开放后新一代永磁电机得到广泛使用与推广。因其体积小,分量轻,少一组直流供电电源,使用更方便; 3.使用国产永磁电机要注意一些基本事项:尽量不要用铁氧体电机。因其磁性弱,电枢电流非常大,小功率的关系不太大,大功率的可能电流过大会影响到直流驱动; 4.Z2电机很多时候都是磁场容易坏,其实并不是开路但电流非常小,这样一来电枢电流非常大,而且转速上不去。电机没力,发热很大,时间一长会烧电机; 5.直流电机的换相器一定要平滑,沟槽
[嵌入式]
直流电机速度控制电路图
直流电机速度控制电路图
[模拟电子]
<font color='red'>直流电机</font>速度控制电路图
带霍尔传感器的三相无刷直流电机控制
无刷直流电动机 (BLDC),也称为电子换向电动机(ECM、EC 电动机)或同步直流电动机,是由直流电通过逆变器或开关电源供电的同步电动机,该同步电动机会产生交流电流来驱动各相通过闭环控制器控制电机。控制器向控制电机速度和扭矩的电机绕组提供电流脉冲。 与有刷电机相比,无刷电机的优势在于高功率重量比、高速度和电子控制。无刷电机在计算机外围设备(磁盘驱动器、打印机)、手持电动工具以及从模型飞机到汽车的车辆等地方都有应用。 该项目描述了如何使用 GreenPAK™ 控制三相无刷直流电机。 下面我们描述了了解解决方案如何编程以创建直流电机控制所需的步骤。但是,如果您只是想得到编程的结果,下载GreenPAK Designer 软件
[嵌入式]
带霍尔传感器的三相无刷<font color='red'>直流电机</font>控制
一种特殊结构的直流电机控制器设计
  1引言   滑模变结构控制系统是一类特殊的变结构控制系统。起特殊之处在于,系统的控制不仅有切换,而且该切换特性可以迫使系统的状态在切换面上沿预定的轨迹作小幅度、高频率的趋近运动-滑动模态运动。这种滑动模态可以设计成与系统的参数及扰动无关。这样,滑模变结构控制无须系统在线辨识就具有很好的鲁棒性。滑模变结构控制近年来已被广泛应用于处理一些复杂的线性系统、非线性系统、时变、多变量耦合等确定性和不确定性系统,可使系统获得良好的动态品质 。而对于高性能的直流伺服系统,一般要求精度高、无超调、响应速度快且鲁棒性好。根据自动调节原理设计的常规PID、PI等控制器,结构简单,设计方法成熟,也容易实现,但直流伺服系统中的非线性、参数的时变性和外部
[嵌入式]
直流电机PWM调速程序
/****************************************************************************** * * *关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * *设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* *可以设定占空比可从1-100变化。即0.01ms*100=1ms * *******************************************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved