- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2025-08-29 10:32:49
已绑定手机
新手上路
- 积分
- 23
|
我在测试PWM直接驱动微型步进电机时遇到的问题: 电机接线如图1
P02 P03 为PWM输出, P10 P14对应线圈的另一个引脚。
用其他牌子的芯片每200uS走一微步,电机的扭矩没有问题,
今天试了用这个要500uS一微步才能驱的起来,
我想看下是不是驱动电流配置的不对。
以下是IO口的配置
void GPIO_config(void)
{
// GPIO_InitTypeDef GPIOA;
P0_MODE_OUT_PP(GPIO_Pin_2|GPIO_Pin_3); //PWM7 PWM8 输出
P0_SPEED_HIGH(GPIO_Pin_2|GPIO_Pin_3);
P0_DRIVE_HIGH(GPIO_Pin_2|GPIO_Pin_3);
P1_MODE_OUT_PP(GPIO_Pin_0|GPIO_Pin_4); //对应PWM7 PWM8
P1_SPEED_HIGH(GPIO_Pin_0|GPIO_Pin_4);
P1_DRIVE_HIGH(GPIO_Pin_0|GPIO_Pin_4);
}
以下为PWM配置
void Steper_init(void)
{
PWMx_InitDefine PWMx_InitStructure;
PWMB_Duty.PWM7_Duty = 150; //M3占空比
PWMB_Duty.PWM8_Duty = 150; //M1占空比
PWMx_InitStructure.PWM_Mode = CCMRn_PWM_MODE1; //模式, CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
PWMx_InitStructure.PWM_Duty = PWMB_Duty.PWM7_Duty; //PWM占空比时间, 0~Period
PWMx_InitStructure.PWM_EnoSelect = ENO7P; //输出通道选择, ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
PWM_Configuration(PWM7, &PWMx_InitStructure); //初始化PWM, PWMA,PWMB
PWMx_InitStructure.PWM_Mode = CCMRn_PWM_MODE1; //模式,
CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
PWMx_InitStructure.PWM_Duty = PWMB_Duty.PWM8_Duty; //PWM占空比时间, 0~Period
PWMx_InitStructure.PWM_EnoSelect = ENO8P; //输出通道选择, ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
PWM_Configuration(PWM8, &PWMx_InitStructure); //初始化PWM, PWMA,PWMB
PWMx_InitStructure.PWM_Period = 300; //周期时间, 0~65535
PWMx_InitStructure.PWM_DeadTime = 0; //死区发生器设置, 0~255
PWMx_InitStructure.PWM_MainOutEnable= ENABLE; //主输出使能, ENABLE,DISABLE
PWMx_InitStructure.PWM_CEN_Enable = ENABLE; //使能计数器, ENABLE,DISABLE
PWM_Configuration(PWMB, &PWMx_InitStructure); //初始化PWM通用寄存器, PWMA,PWMB
PWM7_USE_P02();
PWM8_USE_P03();
NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}
以下是我电机测试部份程序
for(loop=0;loop<60;loop++)
{
PWMB_Duty7(CMRTABLE1[loop%24]*3); //M3
PWMB_Duty8(CMRTABLE4[loop%24]*3); //M1
M0 = CMRTABLE2[loop%24];
M2 = CMRTABLE3[loop%24];
delay_us(800);
}
for(loop=0;loop<2640;loop++)
{
PWMB_Duty7(CMRTABLE1[loop%24]*3); //M3
PWMB_Duty8(CMRTABLE4[loop%24]*3); //M1
M0 = CMRTABLE2[loop%24];
M2 = CMRTABLE3[loop%24];
delay_us(500);
// ASM_DELAY_US(150);
}
|
|