stm32f103vb发出逻辑信号给MOC3020,控制BTA16可控硅的通断。
在检测到过零信号时,延时x毫秒,输出1;延时y毫秒,关闭输出。 实现相位控制调速感应电机(小功率)。
在stm32 discovery开发板上,使用蓝灯和绿灯模拟。
采用定时器的OC,比较输出来做。
选用VBT6的一个Timer来做,它有4个通道可以使用,可以拿来控制4路可控硅输出。
使用CubeMX做外设配置。
针脚配置:
这样不把输出直接发送到Pin上。 能直接发送到Pin上,使用One Pulse Mode 比较方便。 受限于委托公司的设计限制,没法使用脉冲模式。
注意Prescaler的值, 值 = 时钟频率/1000 - 1, 及为1ms.
Pulse 值,表示计数器到达多少时,做输出,触发中断。
中断需要启用。
使用按键来触发定时器,启用两个通道,这里简单使用延时来按键消抖,可以使用状态机处理:
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
HAL_Delay(20);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
// strat timer
__HAL_TIM_SET_COUNTER ( &htim2, 0); // 设置0
HAL_TIM_OC_Start_IT ( &htim2, TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT ( &htim2, TIM_CHANNEL_2);
}
}
定义两个flag:
__IO uint8_t on_led_blue = 0;
__IO uint8_t on_led_green = 0;
在回调函数处理:
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
if (!on_led_blue) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
on_led_blue = 1;
HAL_TIM_OC_Stop_IT ( &htim2, TIM_CHANNEL_1);
//设置新的时间
uint16_t delay_new = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, delay_new + 1999);
HAL_TIM_OC_Start_IT ( &htim2, TIM_CHANNEL_1);
}
else if (on_led_blue) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
on_led_blue = 0;
HAL_TIM_OC_Stop_IT ( &htim2, TIM_CHANNEL_1);
}
}
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
if (!on_led_green) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);#define __HAL_TIM_SET_COMPARE ( __HANDLE__,
__CHANNEL__,
__COMPARE__
)
on_led_green = 1;
HAL_TIM_OC_Stop_IT ( &htim2, TIM_CHANNEL_2);
//设置新的时间
uint16_t delay_new = __HAL_TIM_GET_COUNTER(&htim2, TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, delay_new + 1999);
HAL_TIM_OC_Start_IT ( &htim2, TIM_CHANNEL_2);
}
else if (on_led_green) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
on_led_green = 0;
HAL_TIM_OC_Stop_IT ( &htim2, TIM_CHANNEL_2);
}
}
}
使用flag来区别HAL_TIM_ActiveChannel是 delay_on,还是delay_off。
#define __HAL_TIM_SET_COMPARE ( __HANDLE__,
__CHANNEL__,
__COMPARE__
)
这个宏可以方便的 Sets the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.
效果表现为:
按键按下,蓝灯3秒亮,2秒后灭;绿灯5秒后亮,2秒后灭。
总之,使用Timer的输出Pin接Moc3020,脉冲方式是最省事省心的做法。
而其他Pin的话,只能这里使用一个替代的方法来实现。
上一篇:stm32cubemx下stm32f103读ds18b20
下一篇:stm32 4*4矩阵键盘
推荐阅读最新更新时间:2024-03-16 15:38
设计资源 培训 开发板 精华推荐
- 2024年Automechanika Shanghai海量同期活动刷新历届记录,汇聚行业智慧,共谋未来发展
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 恩智浦发布首个超宽带无线电池管理系统解决方案
- 北交大本科生探秘泰克先进半导体开放实验室,亲历前沿高科技魅力
- 新帅上任:杜德森博士(Dr. Torsten Derr)将于2025年1月1日出任肖特集团首席执行官
- 边缘 AI 如何提升日常体验
- 苹果要首发!台积电宣布2nm已准备就绪
- AMD有望用上全新芯片堆叠技术:延迟大幅减少、性能显著提升
- 宁德时代发布10月战报
- 2024年10月电池行业:增长势头不减!