- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2026-06-07 20:26:03
已绑定手机
注册会员
- 积分
- 126
|
发表于 2026-5-3 10:12:11
|
显示全部楼层
梁工,请教一下M1_StepCnt 这个值, 是不是利用变量类型U8加到最大溢出回0,而不需要在在最大位置设置为0,是否要在255赋值为0,或者减到0不能再减进行设置
if(B_M1_DIR == 0)
M1_StepCnt++; //正转, 下一步, M1_step为细分对应的步距
else
M1_StepCnt--; //反转, 下一步, M1_step为细分对应的步距
/========================================================================
// 函数: void timer1_ISR (void) interrupt TIMER1_VECTOR
// 描述: timer1中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2016-5-12
//========================================================================
void timer1_ISR (void) interrupt TIMER1_VECTOR
{
u8 area; //区间0~3
u8 pwm_A; //A相spwm
u8 pwm_B; //B相spwm
if(B_M1_RunEn) //电机允许运转
{
pwm_A = M1_StepCnt * M1_step; // A相步数计数, M1_step为细分对应的步距
area = pwm_A / 64; // 区间0~3
pwm_B = pwm_A + 64; // B相步数计数
pwm_A = T_SIN[pwm_A]; // A相sPWM值
pwm_B = T_SIN[pwm_B]; // A相sPWM值
if(area == 0) //0区间
{
PWMA_CCR1L = pwm_A; // A+ = sin(A)
PWMA_CCR2L = 0; // A- = 0
PWMA_CCR3L = pwm_B; // B+ = cos(A) = sin(A+64)
PWMA_CCR4L = 0; // B- = 0
}
else if(area == 1) //1区间
{
PWMA_CCR1L = pwm_A; // A+ = sin(A)
PWMA_CCR2L = 0; // A- = 0
PWMA_CCR3L = 0; // B+ = 0
PWMA_CCR4L = pwm_B; // B- = cos(A) = sin(A+64)
}
else if(area == 2) //2区间
{
PWMA_CCR1L = 0; // A+ = sin(A)
PWMA_CCR2L = pwm_A; // A- = 0
PWMA_CCR3L = 0; // B+ = 0
PWMA_CCR4L = pwm_B; // B- = cos(A) = sin(A+64)
}
else //3区间
{
PWMA_CCR1L = 0; // A+ = sin(A)
PWMA_CCR2L = pwm_A; // A- = 0
PWMA_CCR3L = pwm_B; // B+ = cos(A) = sin(A+64)
PWMA_CCR4L = 0; // B- = 0
}
if(B_M1_DIR == 0) M1_StepCnt++; //正转, 下一步, M1_step为细分对应的步距
else M1_StepCnt--; //反转, 下一步, M1_step为细分对应的步距
if(M1_PulseCnt != 0) //总脉冲数非0减1
{
if(--M1_PulseCnt == 0) B_M1_RunEn = 0;
}
if(M1_DownCnt != 0) //减速时刻脉冲数减1
{
if(--M1_DownCnt == 0) f1_set = 200;
}
}
if(B_f1_update) //刷新频率数据
{
B_f1_update = 0;
TR1 = 0;
TL1 = (u8)(f1_period % 256);
TH1 = (u8)(f1_period / 256);
if(B_TIMER1_12T) AUXR &= ~0x40; //12T mode
else AUXR |= 0x40; //1T mode
TR1 = 1;
}
}
|
|