直流电机闭环控制 Keil c51 源代码
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
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