本文的设备为正点原子探索者最小核心板、海康MV-CS032-10GM
一、设备接线与相机配置
- 查看海康工业相机用户手册
- 采用Line0光耦隔离输入(好像缺点是延迟比GPIO高),单片机与光耦隔离地公地
- 从图2来看上下两个除了上拉电阻都差不多,而STM32是5v以下,好像不用接电阻,我就直接把引脚接上了,不知道有没有问题
- 不知道为什么Line1输出不好用,配置GPIO作为输出引脚,注意单片机需要与相机电源地公地(黑线)
二、输出任意频率、占空比可调的PWM波形
TIM_HandleTypeDef timx_out_handle; /* 定时器x句柄 */
void gtim_timx_simulation_init(uint16_t arr, uint16_t psc)
{
TIM_OC_InitTypeDef tim_oc_init_struct = {0}; /* 定时器输出句柄 */
GPIO_InitTypeDef gpio_init_struct;
GTIM_TIMX_OUT_CHY_CLK_ENABLE(); /* 使能TIMx时钟 */
GTIM_TIMX_OUT_CHY_GPIO_CLK_ENABLE(); /* 开启输出IO的时钟 */
gpio_init_struct.Pin = GTIM_TIMX_OUT_CHY_GPIO_PIN; /* 输出比较的GPIO口 */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */
gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; /* 超高速 */
gpio_init_struct.Alternate = GTIM_TIMX_OUT_CHY_GPIO_AF; /* 复用定时器通道 */
HAL_GPIO_Init(GTIM_TIMX_OUT_CHY_GPIO_PORT, &gpio_init_struct);
timx_out_handle.Instance = GTIM_TIMX_OUT; /* 定时器x */
timx_out_handle.Init.Prescaler = psc; /* 预分频系数 */
timx_out_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
timx_out_handle.Init.Period = arr; /* 自动重装载值 */
HAL_TIM_OC_Init(&timx_out_handle); /* 初始化输出比较 */
tim_oc_init_struct.OCMode = TIM_OCMODE_PWM1;
tim_oc_init_struct.Pulse = 9900; /* 设置比较值,此值用来确定占空比 */
tim_oc_init_struct.OCPolarity = TIM_OCPOLARITY_LOW; /* 输出比较极性为低 */
HAL_TIM_OC_ConfigChannel(&timx_out_handle, &tim_oc_init_struct, GTIM_TIMX_OUT_CHY); /* 配置TIMx通道y */
HAL_TIM_OC_Start(&timx_out_handle, GTIM_TIMX_OUT_CHY); /* 开启对应输出比较通道 */
}
三、相机触发输出事件
- 在使能线路翻转后,才会输出如下图的波形(具体为什么不太了解)
- 输出线路持续时间设置为0,图中高电平持续时间就是相机持续曝光的时间,记录上升沿和下降沿的本地时间,取中间时刻即为相机曝光时间
四、测试结果
采集帧率和设置的PWM波的频率一致,应该是成功了
用示波器查看输出信号