3.程序设计
首先使能外部中断和一个定时器,定时器打开溢出中断。初始化部分可参考之前的公众号文章。外部中断用于检测过零点,定时器用于控制导通角和输出脉冲。
调压过程:单片机外部中断被触发后(检测到过零点),根据要输出的电压,计算导通角(延时时间),通过定时器设置延时时间,开启定时器溢出中断。
定时时间到后输出一个脉冲,控制可控硅导通。程序如下:
外部中断函数:
void HAL_GPIO_EX
ti_Callback(uint16_t GPIO_Pin)
{
ac_flag = 0;
if(VoltFan != 0)
{
if(VoltFan 》 220)//大于220V 直接导通
{
HAL_GPIO_WritePin(DOUT2_GPIO_Port,DOUT2_Pin,GPIO_PIN_SET);
}
else
{
ac_delay = ac_delay_us[VoltFan/5];//查表获得延时时间
__HAL_TIM_SET_AUTORELOAD(&htim2,ac_delay);//设置定时器延时时间
__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
__HAL_TIM_ENABLE(&htim2);
}
}
}
定时器中断函数:
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
//HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
if (__HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET)
{
if(ac_flag == 0)
{
ac_flag = 1;
HAL_GPIO_WritePin(DOUT2_GPIO_Port,DOUT2_Pin,GPIO_PIN_SET);//输出脉冲
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
__HAL_TIM_SET_AUTORELOAD(&htim2,100);//设置定时时间100us(脉冲宽度)
}
else if(ac_flag == 1)
{
HAL_GPIO_WritePin(DOUT2_GPIO_Port,DOUT2_Pin,GPIO_PIN_RESET);//100us时间到 关闭脉冲
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
__HAL_TIM_DISABLE(&htim2);
}
}
/* USER CODE END TIM2_IRQn 1 */
}
可控硅的触发脉冲一般在20~50us即可,感性负载脉冲宽度需要加大,一般不小于100us。
程序中延时时间是预先计算好通过查表获得的。计算方法通过计算sinx的积分获得,可参考下表。