新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2017-10-30
- 在线时间
- 15 小时
|
100金钱
我用的控制芯片型号是LB1838,常用与针式打印机,控制方式近似于L298N,但是在控制的时候正反转不能转到同一个位置,比如定义一个原点,在转动不超过360度情况下,定义几个位置,从1-2,2-4都能正常到达指定位置,但是从4-2,2-1就跑偏。由于不能让电机发热太厉害,添加了PWM控制,代码下面贴上,求各路大神帮帮忙,万分感谢
[mw_shl_code=c,true] if(Start_X_Flag == 1)
{
if(Count_T > 0 || reset_flag == 1) //Count_T为需要转动的步数
if(Turn_dir == 1)
{
loop1(run_count_1);
run_count_1 ++;
Count_T--;
}
if(Turn_dir == 0)
{
loop2(run_conut_2);
run_conut_2 ++;
Count_T--;
}
}
if(run_count_1 > 4)
run_count_1 = 1;
if(run_conut_2 > 4)
run_conut_2 = 1;
if(Count_T <= 0)
{
STOP_X();
}
}[/mw_shl_code]
反向转动
[mw_shl_code=c,true]void loop2(u8 step)
{
switch (step)
{
case 3: //0001
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
case 2: //1000
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
case 1: //0010
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
case 0: //0100
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
default:
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
}
delay_us(150);
}[/mw_shl_code]
正向转动
[mw_shl_code=c,true]void loop1(u8 step)
{
switch (step)
{
case 0: //0001
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
case 1: //1000
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
case 2: //0010
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
case 3: //0100
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
default:
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
}
delay_us(150);
}[/mw_shl_code]
通过TTL IO来控制电机转动到某个指定位置
[mw_shl_code=c,true]void GPIO_AN_Task(void)
{
s16 tmp;
s16 Count_gpio;
if(GPIO_TASK_FLAG == 0)
{
Count_gpio = PAin(7)* 8 + PBin(0)* 4 + PBin(1)* 2 + PBin(2)* 1;
Count_gpio += 1;
if(Count_gpio == point)
return;
UART1_Putw_Dec(Count_gpio);
UART1_Put_String("\r\n");
GPIO_TASK_FLAG = 1;
tmp = Count_gpio - point;
if(tmp == 0)
return;
if(Start_X_Flag == 0)
{
if( tmp > 0)
{
Turn_dir = 0;
}
else
{
Turn_dir = 1;
tmp = tmp * (-1);
}
}
Count_T = tmp * 8;
point = Count_gpio; //记录当前位置信息
START_X();
}
}[/mw_shl_code]
|
|