中级会员
- 积分
- 308
- 威望
- 248
- 贡献
- 44
- 兑换币
- 22
- 注册时间
- 2009-12-30
- 在线时间
- 8 小时
|
自己的毕业设计
用的是STC12的芯片
电机软件驱动不了
大家帮俺看看
第一次做智能车,还相当的虾米
#include <STC12C5410AD.h> /* STC12C5410AD 的头文件,为MCU中各个硬件寄存器定个名称,以便C语言中使用*/
sbit Work_Display = P3^4; // 根据硬件设计用与“主控工作指示”接近的名称取代硬件,使程序减少与硬件的相关性
#define TRUE 1
#define FALSE 0
#define LIGHT 0 // 亮逻辑值,用直观的符号化常数替换与硬件密切相关的逻辑值,增加程序的可读性、可移植性。
#define DARK 1 // 暗逻辑值
#define LIGHT_TIME 1000 // 亮时间,使用符号化常数,便于修改,增加程序可读性
#define DARK_TIME 1000 // 暗时间
#define P2MODE0 0x00 /* 0000 0000,P2 口作为马达控制,均作为推挽输出*/
#define P2MODE 0xFF /* 1111 1111,*/
#define P3MODE0 0x10 // 00010000,P3.4 设置为开漏输出,其余均为标准 51 口;
#define P3MODE1 0x10 // 00010000,
/* 定时器参数定义 */
#define T0MODE0 0x00 // 0000 0000,Timer0工作在模式0 ,13位定时;
#define T0MODE1 0x01 // 0000 0001,Timer0工作在模式1 ,16位定时;
#define T0MODE2 0x02 // 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define T0MODE3 0x03 // 0000 0011,Timer0工作在模式3
#define T0_TIMER 0x00 // Timer0 工作在定时器模式
#define T0_COUNTER 0x04 // Timer0 工作在计数器模式
#define T0_DISGATE 0x00 // Timer0 禁止INT0引脚控制
#define T0_ENGATE 0x08 // Timer0 允许INT0引脚控制
#define T1MODE0 0x00 // 0000 0000,Timer1工作在模式0 ,13位定时;
#define T1MODE1 0x10 // 0000 0001,Timer1工作在模式1 ,16位定时;
#define T1MODE2 0x20 // 0000 0010,Timer1工作在模式2 ,8 位自动重加载定时;
#define T1MODE3 0x30 // 0000 0011,Timer1工作在模式3
#define T1_TIMER 0x00 // Timer1 工作在定时器模式
#define T1_COUNTER 0x40 // Timer1 工作在计数器模式
#define T1_DISGATE 0x00 // Timer1 禁止INT1引脚控制
#define T1_ENGATE 0x80 // Timer1 允许INT1引脚控制
#define SET_T0X12_C 0x80 // or AUXR
#define CLR_T0X12_C 0x7F // and AUXR
#define SET_T1X12_C 0x40 // or AUXR
#define CLR_T1X12_C 0xBF // and AUXR
#define TIME1ms_C 0xF8D0 /* 1ms 定时的加载值字节,对应 22.1184MHz 定时器12分频 */
#define TIME1msH_C 0xF8 /* 1ms 定时的加载值高字节 */
#define TIME1msL_C 0xD0 /* 1ms 定时的加载值低字节 */
/* 中断处理参数定义 */
#define EnINT0_C 0x01
#define EnT0_C 0x02
#define EnINT1_C 0x04
#define EnT1_C 0x08
#define EnUART_C 0x10
#define EnADCSPI_C 0x20
#define EnPCALVD_C 0x40
#define INT0_DOWN 0x01 // TCON 中对INT0中断信号的控制,下降沿触发;
#define INT0_LOW 0x00 // TCON 中对INT0中断信号的控制,低电平触发;
#define INT1_DOWN 0x04 // TCON 中对INT1中断信号的控制,下降沿触发;
#define INT1_LOW 0x00 // TCON 中对INT1中断信号的控制,低电平触发;
#define NOIP_C 0x00 /* 无优先级 */
#define INT0_HIGH 0x01 // IP 寄存器中的优先级设置,IPH暂不处理。
#define T0_HIGH 0x02
#define INT1_HIGH 0x04
#define T1_HIGH 0x08
#define UART_HIGH 0x10
#define ADCSPI_HIGH 0x20
#define PCALVD_HIGH 0x40
// 马达控制口
#define MotorDrv P2 // P2.0 - P2.2 控制左电机, P2.4 - P2.6 控制右电机,输出
// PCA 初始化常数,
#define STARTPCA_C 0x40; // or CCON 中的CR位控制 启动 PCA
#define STOPPCA_C 0xBF; // and CCON 中的CR位控制 停止 PCA
#define FOSCdiv12_C 0x00
#define FOSCdiv2_C 0x02
#define T0Over_C 0x04 // T0 溢出
#define ECI_C 0x06 // 外部脉冲输入
#define EnCF_C 0x01 // 允许PCA溢出中断
#define EnCMP_C 0x40 // 0100 0000, CCAPMn 中控制位6, 允许比较器
#define EnCAPP_C 0x20 // 0010 0000, CCAPMn 中控制位5, 允许上升沿捕获
#define EnCAPN_C 0x10 // 0001 0000, CCAPMn 中控制位4, 允许下降沿捕获
#define EnMAT_C 0x08 // 0000 1000, CCAPMn 中控制位3, 允许匹配或捕获后置位 CCFn
#define EnTOG_C 0x04 // 0000 0100, CCAPMn 中控制位2, 允许匹配或捕获后触发输出翻转
#define EnPWM_C 0x02 // 0000 0010, CCAPMn 中控制位1, 允许对应的端子输出PWM信号
#define EnCCFI_C 0x01 // 0000 0001, CCAPMn 中控制位0, 允许CCF产生中断
// PCA 中断
#define EnPCALVD_C 0x40
// PCA 优先级
#define PCALVD_HIGH 0x40
#define MOTOR_L 0
#define MOTOR_R 1
#define BREAK_PWM 0 // 刹车 PWM 控制值
#define FLOAT_PWM 255 // 惰行 PWM 控制值
// 电机控制输出
/* 控制位对应关系:
电机1(左)
P2.0 - CtrlL1, H 桥的左、右上臂,1 电平输出导通 0 电平输出截止,只有在对应下臂截止时有效
P2.1 - CtrlL2, H 桥的左下臂,1 电平输出导通 0 电平输出截止
P2.2 - CtrlL3, H 桥的右下臂,0 电平输出导通 1 电平输出截止
电机 2(右)
P2.4 - CtrlR1, H 桥的左、右上臂,1 电平输出导通 0 电平输出截止,只有在对应下臂截止时有效
P2.5 - CtrlR2, H 桥的左下臂,1 电平输出导通 0 电平输出截止
P2.6 - CtrlR3, H 桥的右下臂,0 电平输出导通 1 电平输出截止
控制逻辑:
Ctrl1 Ctrl2 Ctrl3 Drv1 Drv2 Drv3 Drv4 电机状态
X 0 0 0/截止 0/导通 0/截止 0/导通 刹车
PWM 1 0 PWM 1/截止 0/截止 0/导通 正转
PWM 0 1 0/截止 0/导通 PWM 1/截止 反转
0 1 1 0/截止 1/截止 0/截止 1/截止 惰行
1 1 1 1/导通 1/截止 1/导通 1/截止 刹车
电机 2 控制逻辑相同,只是对应高 3 位。
*/
// 左电机控制
#define ML_FORWARD 0x02 // 0000 0010 前进,左上、右下导通,
#define ML_BACK 0x04 // 0000 0100 后退,左下、右上导通
#define ML_FLOAT 0x06 // 0000 0110 浮空,4 个臂都截止,此时 Ctrl1 应停止PWM输出,维持“0”。
#define ML_BRAKE 0x00 // 0000 0000 刹车,两个下臂导通,上臂截止
#define ML_MASK 0xF8 // 清除原来输出值,保留另一个电机的输出
// 右电机控制
#define MR_FORWARD 0x20 // 0010 0000 前进,左上、右下导通,
#define MR_BACK 0x40 // 0100 0000 后退,左下、右上导通
#define MR_FLOAT 0x60 // 0110 0000 行进控制浮空,4 个臂都截止 n
#define MR_BRAKE 0x00 // 0000 0000 行进控制刹车,两个下臂导通,上臂截止
#define MR_MASK 0x8F // 清除原来输出值,保留另一个电机的输出
#define PWM_OUT_VALID 1 // PWM 脉冲输出控制上臂导通
#define PWM_OUT_INVALID 0 // PWM 脉冲输出控制上臂截止
// -------- 以下为StepByStep之三增加的变量 070618 ------------------
unsigned char code ga_ucForward[2] = {ML_FORWARD,MR_FORWARD}; // 前进控制
unsigned char code ga_ucBack[2] = {ML_BACK,MR_BACK}; // 后退控制
unsigned char code ga_ucFloat[2] = {ML_FLOAT,MR_FLOAT}; // 惰行控制
unsigned char code ga_ucBrake[2] = {ML_BRAKE,MR_BRAKE}; // 刹车控制
unsigned char code ga_ucMask[2] = {ML_MASK,MR_MASK}; // 屏蔽字,为了输出新的控制信号,清除原来的控制值
unsigned int ga_uiMotorCtrl[2]; // 电机控制参数,高字节控制方向, 0 - 前进 0xFF - 后退,低字节PWM值
/*********** 主程序 *****************/
void main(void)
{
unsigned int i,j,k;
unsigned char ucCtrl_Buf;
// ----------- 初始化硬件 ---------------
P3M0 = P3MODE0; // 因为只涉及 P3 口,所以此处只初始化 P3
P3M1 = P3MODE1;
// 初始化 PCA
CMOD = FOSCdiv12_C; // PCA 时钟源为 Fosc/12 , 不允许 count 溢出中断 CF。休眠时 PCA 工作
CCAPM2 = EnCMP_C|EnPWM_C; // PCA 的模块 2 用于左电机控制,8 位PWM模式;
PCA_PWM2 = 0x03; // 初始化为PWM恒输出 0, 以便进入惰行状态。
CCAP2L = 0xFF;
CCAP2H = 0xFF;
CCAPM3 = EnCMP_C|EnPWM_C; // PCA 的模块 3 用于右电机控制,8 位PWM 模式;
PCA_PWM3 = 0x03; // 初始化为PWM恒输出 0, 以便进入惰行状态。
CCAP3L = 0xFF;
CCAP3H = 0xFF;
CL = 0;
CH = 0;
CCON = CCON|STARTPCA_C; // 启动 PCA
Work_Display = DARK;
ucCtrl_Buf = ga_ucForward[0];
MotorDrv = (MotorDrv&ga_ucMask[0])|ucCtrl_Buf;
PCA_PWM2 = 0x00;
CCAP2L = 0x7F;
CCAP2H = 0x7F;
ucCtrl_Buf = ga_ucForward[1];
MotorDrv = (MotorDrv&ga_ucMask[1])|ucCtrl_Buf;
PCA_PWM3 = 0x00;
CCAP3L = 0x7F;
CCAP3H = 0x7F;
while(1)
{
for(i=0;i<50000;i++);
for(j=0;j<50000;j++);
for(k=0;k<50000;k++);
Work_Display = LIGHT;
ucCtrl_Buf = ga_ucBrake[0];
MotorDrv = (MotorDrv&ga_ucMask[0])|ucCtrl_Buf;
ucCtrl_Buf = ga_ucBrake[1];
MotorDrv = (MotorDrv&ga_ucMask[1])|ucCtrl_Buf;
}
// --------- 主循环 ------------------------
while(1)
{}
} |
|