微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 直流电机控制Keil c51源代码

直流电机控制Keil c51源代码

时间:11-11 来源:互联网 点击:
直流电机开环控制Keil c51源代码

//-----------------------函数声明,变量定义------------------------
#include
#include
#include
//-----------------------定义管脚----------------------------------
sbit PWM=P1^0; //PWM波形输出
sbit DR=P1^1;//方向控制
#define timer_data (256-100) //定时器预置值,12M时钟是,定时0.1ms
#define PWM_T 100 //定义PWM的周期T为10ms
unsigned char PWM_t; //PWM_t为脉冲宽度(0~100)时间为0~10ms
unsigned char PWM_count;//输出PWM周期计数
unsigned char time_count; //定时计数
bit direction; //方向标志位
//-----------------------------------------------------------------
// 函数名称:timer_init
// 函数功能:初始化设施定时器
//-----------------------------------------------------------------
void timer_init()
{
TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
PCON=0x00;
TF0=0;
TH0=timer_data; //保证定时时长为0.1ms
TL0=TH0;
ET0=1;
TR0=1; //开始计数
EA=1;//中断允许
}
//-----------------------------------------------------------------
// 函数名称:setting_PWM
// 函数功能:设置PWM的脉冲宽度和设定方向
//-----------------------------------------------------------------
void setting_PWM()
{
if(PWM_count==0) //初始设置
{
PWM_t=20;
direction=1;
}
}
//-----------------------------------------------------------------
// 函数名称:IntTimer0
// 函数功能:定时器中断处理程序
//-----------------------------------------------------------------
void IntTimer0() interrupt 1
{
time_count++;
DR=direction;
if(time_count>=PWM_T)
{
time_count=0;
PWM_count++;
setting_PWM(); //每输出一个PWM波调用一次
}
if(time_countPWM=1;
else
PWM=0;
}
//-----------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//-----------------------------------------------------------------
void main()
{
timer_init();
setting_PWM();
}

//=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=

直流电机闭环控制Keil c51源代码

//-----------------------函数声明,变量定义------------------------
#include
sbit INT_0 =P3^2; // 将p3.2外部中断0
sbit pulse_A=P1^2; // P1.2为脉冲A输入
sbit PWM=P1^0; //PWM波形输出
sbit DR=P1^1; //方向控制
//-----------------------预定义值----------------------------------
#define PWM_T 1800 //定义PWM的周期T为18ms
#define Ts 1000 //定义光电编码器采样时间为10ms
#define timer_data (256-10) //定时器预置值,12M时钟是,定时0.01ms
//-----------------------预设定值----------------------------------
bit direction; //方向标志位 用户设定
unsigned char R; //需要得到的直流电机转速 用户设定
//-----------------------实际运行状态------------------------------
bit real_direction; //电机实际运行方向
unsigned char Rr; //直流电机实际转速
//-----------------------计算所得补偿状态--------------------------
bit compensate_polarity; //补偿极性
unsigned char dR; //转速补偿
//-----------------------经补偿后得到的脉宽------------------------
unsigned char PWM_t; //PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
unsigned char PWM_count; //输出PWM周期计数
//-----------------------各中间计数值------------------------------
unsigned char pulseB_count; //脉冲计数
unsigned char time0_count; //定时计数
unsigned char time1_count; //定时计数
//-----------------------------------------------------------------
// 函数名称:timer_init
// 函数功能:初始化设置定时器
//-----------------------------------------------------------------
void timer_init()
{
TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
PCON=0x00;
TF0=0;
TH0=timer_data; //保证定时时长为0.01ms
TL0=TH0;
TH1=timer_data; //保证定时时长为0.01ms
TL1=TH0;
ET0=1; //定时器0中断允许
TR0=1; //定时器0开始计数
ET1=1; //定时器1中断允许
TR1=1; //定时器1开始计数
EA=1; //中断允许
}
//-----------------------------------------------------------------
// 函数名称: INT0_init()
// 函数功能: 初始化设置
// 设定INT0的工作方式
//-----------------------------------------------------------------
void INT0_init(void )
{
pulseB_count=0; //

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top