初级会员

- 积分
- 100
- 金钱
- 100
- 注册时间
- 2018-11-13
- 在线时间
- 27 小时
|
1金钱
官方的F407IGT6例程中,PWM的占空比最高可以设置到4800,但我自己写的程序,最高到2500就开始报电流过大了。我的思路和官方例程是一样的。先在main函数中初始化,然后在定时器gtim.c的中断里查询霍尔传感器的值,然后在bldc.c中改变通电顺序。如果占空比设置超过2500,通电后会抖一下,然后停机,电流过大的指示灯亮起。我找了半天没发现问题的坐在,请大佬帮忙找找原因。非常感谢。
/************以下之主函数的初始化,定时器部分和官方例程的参数一样***************/
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
beep_init(); /* 初始化蜂鸣器 */
gtim_tim1_oc_chy_init(10000-1,0); /* 定时器1初始化 */
while (1)
{
}
}
/****************以下代码是在定时器中断回调函数中,检测霍尔传感器位置,并改变电流方向***************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) /* 每次计数到达自动重装载值时,就进入一次中断 */
{
if(htim->Instance == TIM1) /* 55us */
{
hall_one = 0;
if(HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_10) != GPIO_PIN_RESET)
{
hall_one |= 0x01;
}
if(HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_11) != GPIO_PIN_RESET)
{
hall_one |= 0x02;
}
if(HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_12) != GPIO_PIN_RESET)
{
hall_one |= 0x04;
}
}
if(m1_direction == 0) //正转
{
switch(hall_one)
{
case 0x05:
m1_uhvl();
break;
case 0x01:
m1_uhwl();
break;
case 0x03:
m1_vhwl();
break;
case 0x02:
m1_vhul();
break;
case 0x06:
m1_whul();
break;
case 0x04:
m1_whvl();
break;
default:
m1_stop();
break;
}
}
if(m1_direction == 1) //反转
{
switch(hall_one)
{
case 0x05:
m1_vhul();
break;
case 0x01:
m1_whul();
break;
case 0x03:
m1_whvl();
break;
case 0x02:
m1_uhvl();
break;
case 0x06:
m1_uhwl();
break;
case 0x04:
m1_vhwl();
break;
default:
m1_stop();
break;
}
}
}
/****************以下代码是六步换向,其中m1_speed不能大于2500*********************/
uint16_t m1_speed = 2500; /* 电机1的转速 */
void m1_uhvl(void)
{
g_atim1_handle.Instance->CCR1 = m1_speed;
g_atim1_handle.Instance->CCR2 = 0;
g_atim1_handle.Instance->CCR3 = 0;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //W相下桥臂
}
void m1_uhwl(void)
{
g_atim1_handle.Instance->CCR1 = m1_speed;
g_atim1_handle.Instance->CCR2 = 0;
g_atim1_handle.Instance->CCR3 = 0;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET); //W相下桥臂
}
void m1_vhwl(void)
{
g_atim1_handle.Instance->CCR1 = 0;
g_atim1_handle.Instance->CCR2 = m1_speed;
g_atim1_handle.Instance->CCR3 = 0;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET); //W相下桥臂
}
void m1_vhul(void)
{
g_atim1_handle.Instance->CCR1 = 0;
g_atim1_handle.Instance->CCR2 = m1_speed;
g_atim1_handle.Instance->CCR3 = 0;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //W相下桥臂
}
void m1_whul(void)
{
g_atim1_handle.Instance->CCR1 = 0;
g_atim1_handle.Instance->CCR2 = 0;
g_atim1_handle.Instance->CCR3 = m1_speed;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //W相下桥臂
}
void m1_whvl(void)
{
g_atim1_handle.Instance->CCR1 = 0;
g_atim1_handle.Instance->CCR2 = 0;
g_atim1_handle.Instance->CCR3 = m1_speed;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //W相下桥臂
}
void m1_stop(void)
{
__HAL_TIM_SET_COMPARE(&g_atim1_handle, TIM_CHANNEL_1, 0); //U相上桥臂
__HAL_TIM_SET_COMPARE(&g_atim1_handle, TIM_CHANNEL_2, 0); //V相上桥臂
__HAL_TIM_SET_COMPARE(&g_atim1_handle, TIM_CHANNEL_3, 0); //W相上桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); //U相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET); //V相下桥臂
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET); //W相下桥臂
}
再次感谢大佬。
|
|