初中生
最后登录1970-1-1
在线时间 小时
注册时间2023-1-2
|
// 开启TIMx_CLK,x[1,8]
MOTOR_TIM_CLK_ENABLE();
/* 定义定时器的句柄即确定定时器寄存器的基地址*/
htimx_bldcm.Instance = MOTOR_TIM(TIM8);
/* 累计 TIM_Period个后产生一个更新或者中断*/
//当定时器从0计数到PWM_PERIOD_COUNT,即为5600次,为一个定时周期
htimx_bldcm.Init.Period = PWM_PERIOD_COUNT - 1;
// 高级控制定时器时钟源TIMxCLK = HCLK=168MHz
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)/(TIM_Period)=15KHz
htimx_bldcm.Init.Prescaler = PWM_PRESCALER_COUNT - 1;
// 采样时钟分频
htimx_bldcm.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
// 计数方式
htimx_bldcm.Init.CounterMode=TIM_COUNTERMODE_UP;
// 重复计数器
htimx_bldcm.Init.RepetitionCounter=0;
// 初始化定时器TIMx, x[1,8]
HAL_TIM_PWM_Init(&htimx_bldcm);
/*PWM模式配置*/
//配置为PWM模式1
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.Pulse = 0; // 默认必须要初始为0
TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM_OCInitStructure.OCNPolarity = TIM_OCNPOLARITY_HIGH;
TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(&htimx_bldcm,&TIM_OCInitStructure,TIM_CHANNEL_1); // 初始化通道 1 输出 PWM
HAL_TIM_PWM_ConfigChannel(&htimx_bldcm,&TIM_OCInitStructure,TIM_CHANNEL_2); // 初始化通道 2 输出 PWM
HAL_TIM_PWM_ConfigChannel(&htimx_bldcm,&TIM_OCInitStructure,TIM_CHANNEL_3); // 初始化通道 3 输出 PWM
/* 配置触发源 */案例来自骄阳第十一章无刷直流电机
HAL_TIMEx_ConfigCommutationEvent(&htimx_bldcm, TIM_TS_ITR3, TIM_COMMUTATION_SOFTWARE);
//请问TIM8为什么要配置触发源,TIM8的时钟来自系统时钟,为什么要联立TIM5-HALL的时钟,HALL的时钟案例采用10HZ,为什么不采用15hz,100hz或者其他频率;而且TIM5的周期和预分频系数是否可以分别为10000,840。TIM5与TIM8联立,TIM8为主还是TIM5为主,视频并未详细说明。对于这些问题,本学员未能理清详细的问题,还请野火老师予以解惑!十分感谢野火平台
/* 开启定时器通道1输出PWM */
HAL_TIM_PWM_Start(&htimx_bldcm,TIM_CHANNEL_1);
/* 开启定时器通道2输出PWM */
HAL_TIM_PWM_Start(&htimx_bldcm,TIM_CHANNEL_2);
/* 开启定时器通道3输出PWM */
HAL_TIM_PWM_Start(&htimx_bldcm,TIM_CHANNEL_3);
/************************************************************************
以下为HALL_TIM-TIM5的配置
TIM_HallSensor_InitTypeDef hall_sensor_cfg;
/* 基本定时器外设时钟使能 */
HALL_TIM_CLK_ENABLE();
/* 定时器基本功能配置 */
htimx_hall.Instance = HALL_TIM;
htimx_hall.Init.Prescaler = HALL_PRESCALER_COUNT - 1; // 预分频
htimx_hall.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数
htimx_hall.Init.Period = HALL_PERIOD_COUNT - 1; // 计数周期
htimx_hall.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频
hall_sensor_cfg.IC1Prescaler = TIM_ICPSC_DIV1; // 输入捕获分频
hall_sensor_cfg.IC1Polarity = TIM_ICPOLARITY_BOTHEDGE; // 输入捕获极性
hall_sensor_cfg.IC1Filter = 10; // 输入滤波
hall_sensor_cfg.Commutation_Delay = 0U; // 不使用延迟触发
HAL_TIMEx_HallSensor_Init(&htimx_hall, &hall_sensor_cfg);
HAL_NVIC_SetPriority(HALL_TIM_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(HALL_TIM_IRQn);
|
|