CX32L003 PID调制PWM输出
XMC的芯片提供的SDK类似于STM32HAL库版本,中断部分有些坑,需要注意!!!
程序主要目的:
利用AD采集反馈,持续输出稳定的pwm调制电压,当然还接收主机控制输出设置的值
SDK中一些需要注意的地方
目前发现的错误地方都已经发过邮件告知官方,至于啥时候修复这些问题不知道!
PWM配置
初始化
Tim1_Config_Init(10000 ,SET_PWM_PEIOD);/*10Khz 400 cycle*/
通道部分
TIM_HandleTypeDef htim1;
TIM_OC_InitTypeDef sConfigOC;
/**
******************************************************************
* @brief 定时器1初始化
* @author aron566
* @version v1.0
* @date 2020/3/17
******************************************************************
*/
void Tim1_Config_Init(uint32_t frequncy ,uint32_t period)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
/*开启定时器时钟*/
__HAL_RCC_TIMx_CLK_ENABLE();
/*分频值 = 返回plck总线上分频后的时钟频率 / 定时器需要的频率*/
uint32_t uwPrescalerValue = (uint32_t)(HAL_RCC_GetPCLKFreq() / (frequncy*period)) - 1;
htim1.Instance = TIM_1;
htim1.Init.Prescaler = uwPrescalerValue;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = period-1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
/*CNT < CCR1 = TIM_OCPOLARITY_HIGH*/
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = period; /*100%out*/
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCNPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = period/2;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler