直流电机开环操控Keil c51源代码
//———————–函数声明,变量界说————————
#include
#include
#include
//———————–界说管脚———————————-
sbit PWM=P1^0; //PWM波形输出
sbit DR=P1^1;//方向操控
#define timer_da
#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_da
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_count
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_da
//———————–预设定值———————————-
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_da
TL0=TH0;
TH1=timer_da
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; //脉冲计数器清零
IT0=1; //挑选INT0为沿触发方法
EX0=1; //外部中止答应
EA=1; //体系中止答应
}
//—————————————————————–
// 函数称号:setting_PWM
// 函数功用:设置PWM的脉冲宽度和设定方向
//—————————————————————–
void setting_PWM()
{
// direction=1; //设定滚动方向
// R=540; //设定转速
// dR=0; //转速补偿为零
// calculate_PWM_t(); //从头核算脉宽
}
//—————————————————————–
// 函数称号: calculate_PWM_t
// 进口参数: R需求得到的直流电机转速,dR转速补偿
// 出口参数: PWM_t为脉冲宽度(320~400)时刻为3.2~4.0ms
// 函数功用: 核算脉冲宽度,PWM_t=R/150;
//—————————————————————–
void calculate_PWM_t()
{
if(compensate_polarity==1) //正补偿
PWM_t=(R+dR)/150;
else
PWM_t=(R-dR)/150; //负批改
}
//—————————————————————–
// 函数称号: calculate_Rr
// 进口参数: pulseB_count脉冲计数
// 出口参数: Rr直流电机实践转速
// 函数功用: 核算实践转速
//—————————————————————–
void calculate_Rr()
{
Rr=pulseB_count/6;
}
//—————————————————————–
// 函数称号: compensate_dR
// 进口参数: Rr直流电机实践转速
// R需求得到的直流电机转速
// 出口参数: dR转速补偿
// 函数功用: 核算实践补偿值和补偿极性 ,依据不同的补偿算法从头规划
//—————————————————————–
void compensate_Rr()
{
Rr=1;
if(Rr>R)
compensate_polarity=0; //补偿极性
else
compensate_polarity=1;
}
//—————————————————————–
// 函数称号: INT0_intrupt
// 函数功用: 外部中止0处理程序
//—————————————————————–
void INT0_intrupt() interrupt 0 using 1
{
pulseB_count++;
if(pulse_A==0)
{
real_direction=1; //若P1.2为低电平,则电机为正转,计数器N的值加1
}
else //若为高电平,则电机为回转,计数器N值减l。
{
real_direction=1;
}
}
//—————————————————————–
// 函数称号:IntTimer0
// 函数功用:守时器中止处理程序
//—————————————————————–
void IntTimer0() interrupt 1
{
time0_count++;
DR=direction;
if(time0_count>=PWM_T)
{
time0_count=0;
PWM_count++;
setting_PWM(); //每输出一个PWM波调用一次
}
if(time0_count
else
PWM=0;
}
//—————————————————————–
// 函数称号:IntTimer1
// 函数功用:守时器中止处理程序
//—————————————————————–
void IntTimer1() interrupt 3
{
time1_count++;
if(time1_count==1)
{
INT0_init(); //初始化外部中止设置
}
if(time1_count>=Ts)
{
time1_count=0; //一个补偿周期完毕,计数器清零
calculate_Rr(); //核算实践转速
compensate_Rr(); //核算实践补偿值和补偿极性
calculate_PWM_t(); //从头核算脉宽
}
}
//—————————————————————–
// 函数称号:main
// 用户主函数
// 函数功用:主函数
//—————————————————————–
void main()
{
direction=1; //设定滚动方向
R=540; //设定转速
dR=0; //转速补偿为零
calculate_PWM_t(); //从头核算脉宽
timer_init();
}