智能小车电机源代码_第1页
智能小车电机源代码_第2页
智能小车电机源代码_第3页
智能小车电机源代码_第4页
智能小车电机源代码_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、直流电机控制Keilc51源代码直流电机的开环控制KeilC51源代码/函数声明,变量定义#include#include#include/定义管脚sbitPWM=PO;/PWM波形输出sbitDR=P1A1;方向控制#definetimer_data(256-100)/定时器预置值,12M时钟是,定时0.1ms#definePWM_T100定义PWM的周期T为10msunsignedcharPWM_t;/PWM_t为脉冲宽度(0100)时间为010msunsignedcharPWM_count;/输出PWM周期计数unsignedchartime_count;/定时计数bitdirectio

2、n;/方向标志为/函数名称:timer_init/函数功能:初始化设施定时器/voidtimer_init()TMOD=0 x22;/*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装)*/PCON=0 x00;TF0=0;TH0=timer_data;/保证定时时长为0.1msTL0=TH0;ET0=1;TR0=1;/开始计数EA=1;/中断允许/函数名称:setting_PWM/函数功能:设置PWM的脉冲宽度和设定方向/voidsetting_PWM()if(PWM_count=0)/初始设置PWM_t=20;direction=1;/函数名称:IntTimerO/函数功能:

3、定时器中断处理程序/voidIntTimerO()interrupt1time_count+;DR=direction;if(time_count=PWM_T)time_count=O;PWM_count+;setting_PWM();每输出一个PWM波调用一次if(time_countPWM_t)PWM=1;elsePWM=O;/函数名称:main/用户主函数/函数功能:主函数/voidmain()timer_init();setting_PWM();直流电机闭环控制KeilC51源代码/函数声明,变量定义#include/将p3.2外部中断/将p3.2外部中断0/P1.2为脉冲A输入sbi

4、tpulse_A=P2;sbitPWM=PO;sbitDR=P1sbitPWM=PO;sbitDR=P1A1;/PWM波形输出/方向控制/预定义值#definePWM_T1800定义PWM的周期T为18ms#defineTs1000/定义光电编码器采样时间为10ms#definetimer_data(256-10)定时器预置值,12M时钟是,定时0.01ms/预设定值bitdirection;/方向标志位用户设定unsignedcharR;/需要得到的直流电机转速用户设定/实际运行状态bitreal_direction;/电机实际运行方向unsignedcharRr;/直流电机实际转速/计算所

5、得补偿状态bitcompensate_polarity;/补偿极性unsignedchardR;/转速补偿/经补偿后得到的脉宽unsignedcharPWM_t;/PWM_t为脉冲宽度(320400)时间为3.24.0msunsignedcharPWM_count;输出PWM周期计数/各中间计数值unsignedcharpulseB_count;/脉冲计数unsignedchartime0_count;/定时计数unsignedchartime1_count;/定时计数/函数名称:timer_init/函数功能:初始化设置定时器/voidtimer_init()TMOD=0 x22;/*定时器

6、1为工作模式2(8位自动重装),0为模式2(8位自动重装)*/PCON=0 x00;TF0=0;TH0=timer_data;/保证定时时长为0.01msTL0=TH0;TH1=timer_data;/保证定时时长为0.01msTL1=TH0;ET0=1;/定时器0中断允许TR0=1;/定时器0开始计数ET1=1;/定时器1中断允许TR1=1;/定时器1开始计数EA=1;/中断允许/函数名称:INT0_init()/函数功能:初始化设置/设定INTO的工作方式/voidINTO_init(void)pulseB_count=O;/脉冲计数器清零IT0=1;选择INTO为沿触发方式EXO=1;/

7、外部中断允许EA=1;/系统中断允许/函数名称:setting_PWM/函数功能:设置PWM的脉冲宽度和设定方向/voidsetting_PWM()/direction=1;/设定转动方向/R=54O;/设定转速/dR=O;/转速补偿为零/calculate_PWM_t();/重新计算脉宽/函数名称:calculate_PWM_t/入口参数:R需要得到的直流电机转速,dR转速补偿/出口参数:PWM_t为脉冲宽度(320400)时间为3.24.0ms/函数功能:计算脉冲宽度,PWM_t=R/150;/voidcalculate_PWM_t()if(compensate_polarity=1)/正

8、补偿PWM_t=(R+dR)/15O;elsePWM_t=(R-dR)/15O;/负修正/函数名称:calculate_Rr/入口参数:pulseB_count脉冲计数/出口参数:Rr直流电机实际转速/函数功能:计算实际转速/voidcalculate_Rr()Rr=pulseB_count/6;/函数名称:compensate_dR/入口参数:Rr直流电机实际转速/R需要得到的直流电机转速/出口参数:dR转速补偿/函数功能:计算实际补偿值和补偿极性,根据不同的补偿算法重新设计/voidcompensate_Rr()Rr=1;if(RrR)compensate_polarity=0;/补偿极性

9、elsecompensate_polarity=1;/函数名称:INT0_intrupt/函数功能:外部中断0处理程序/voidINT0_intrupt()interrupt0using1pulseB_count+;if(pulse_A=0)real_direction=1;/若P1.2为低电平,则电机为正转,计数器N的值加1else若为高电平,则电机为反转,计数器N值减I。real_direction=1;/函数名称:IntTimer0/函数功能:定时器中断处理程序/voidIntTimer0()interrupt1time0_count+;DR=direction;if(time0_count=PWM_T)time0_count=0;PWM_count+;setting_PWM();/每输出一个PWM波调用一次if(time0_count=Ts)time1_count=0;/一个补偿周期结束,计数器清零calculate_Rr();/计算实际转速compensate_Rr();/计算实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论