void MX_TIM3_Init(void) // 1ms { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 83999; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } __HAL_TIM_ENABLE(&htim3); }TIM5的初始化复制/* 84M*/ void MX_TIM5_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; htim5.Instance = TIM5; htim5.Init.Prescaler = 0; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.Period = Tim5_CCR/init_speed-1; htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim5) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) { Error_Handler(); } __HAL_TIM_ENABLE(&htim5); TIM5 ->CR1 |= 0x0080; }TIM3中断函数 复制void TIM3_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); HAL_TIM_IRQHandler(&htim3); TIM3->ARR = 83999; { if(speed_up1==1) { if(vx1<speed_max) { vx1 += (float)slope_val/1000; if(vx1>speed_max) { vx1 = speed_max; speed_up1 = 0; } timer5ARR = Tim5_CCR/vx1; } } if(speed_down1==1) { if(vx1>cutoff_speed) { vx1 -= (float)slope_val/1000; if(vx1<=cutoff_speed) { vx1 = cutoff_speed; speed_down1 = 0; MOTOR_mov_flag = 0; } timer5ARR = Tim5_CCR/vx1; } } } CPU_IntEn(); OSIntExit(); }TIM5中断函数复制void TIM5_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); { HAL_TIM_IRQHandler(&htim5); TIM5->ARR = timer5ARR; HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); turns_pulse_nums++; if(MOTOR_mov_flag) { if(turns_pulse_nums>=distance_R*8) { MOTOR_mov_over = 1; speed_down1 = 1; MOTOR_mov_flag = 0; } } } CPU_IntEn(); OSIntExit(); }后来改成TIM3定时0.1ms,有改善,这样的到底要怎么处理呢?
/* 84M*/ void MX_TIM5_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; htim5.Instance = TIM5; htim5.Init.Prescaler = 0; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; htim5.Init.Period = Tim5_CCR/init_speed-1; htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim5) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) { Error_Handler(); } __HAL_TIM_ENABLE(&htim5); TIM5 ->CR1 |= 0x0080; }TIM3中断函数 复制void TIM3_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); HAL_TIM_IRQHandler(&htim3); TIM3->ARR = 83999; { if(speed_up1==1) { if(vx1<speed_max) { vx1 += (float)slope_val/1000; if(vx1>speed_max) { vx1 = speed_max; speed_up1 = 0; } timer5ARR = Tim5_CCR/vx1; } } if(speed_down1==1) { if(vx1>cutoff_speed) { vx1 -= (float)slope_val/1000; if(vx1<=cutoff_speed) { vx1 = cutoff_speed; speed_down1 = 0; MOTOR_mov_flag = 0; } timer5ARR = Tim5_CCR/vx1; } } } CPU_IntEn(); OSIntExit(); }TIM5中断函数复制void TIM5_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); { HAL_TIM_IRQHandler(&htim5); TIM5->ARR = timer5ARR; HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); turns_pulse_nums++; if(MOTOR_mov_flag) { if(turns_pulse_nums>=distance_R*8) { MOTOR_mov_over = 1; speed_down1 = 1; MOTOR_mov_flag = 0; } } } CPU_IntEn(); OSIntExit(); }后来改成TIM3定时0.1ms,有改善,这样的到底要怎么处理呢?
void TIM3_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); HAL_TIM_IRQHandler(&htim3); TIM3->ARR = 83999; { if(speed_up1==1) { if(vx1<speed_max) { vx1 += (float)slope_val/1000; if(vx1>speed_max) { vx1 = speed_max; speed_up1 = 0; } timer5ARR = Tim5_CCR/vx1; } } if(speed_down1==1) { if(vx1>cutoff_speed) { vx1 -= (float)slope_val/1000; if(vx1<=cutoff_speed) { vx1 = cutoff_speed; speed_down1 = 0; MOTOR_mov_flag = 0; } timer5ARR = Tim5_CCR/vx1; } } } CPU_IntEn(); OSIntExit(); }TIM5中断函数复制void TIM5_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); { HAL_TIM_IRQHandler(&htim5); TIM5->ARR = timer5ARR; HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); turns_pulse_nums++; if(MOTOR_mov_flag) { if(turns_pulse_nums>=distance_R*8) { MOTOR_mov_over = 1; speed_down1 = 1; MOTOR_mov_flag = 0; } } } CPU_IntEn(); OSIntExit(); }后来改成TIM3定时0.1ms,有改善,这样的到底要怎么处理呢?
void TIM5_IRQHandler(void) { CPU_IntDis(); //CPU_CRITICAL_ENTER; OSIntEnter(); { HAL_TIM_IRQHandler(&htim5); TIM5->ARR = timer5ARR; HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); turns_pulse_nums++; if(MOTOR_mov_flag) { if(turns_pulse_nums>=distance_R*8) { MOTOR_mov_over = 1; speed_down1 = 1; MOTOR_mov_flag = 0; } } } CPU_IntEn(); OSIntExit(); }后来改成TIM3定时0.1ms,有改善,这样的到底要怎么处理呢?
收藏0 举报
airwill 发表于 2019-12-22 18:24 看情况是异步性问题吧
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
等级类勋章
发帖类勋章
39
73
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号