使用stm32主从门控模式精确控制脉冲个数
来源:互联网 发布:mac 安装非app store 编辑:程序博客网 时间:2024/06/05 00:33
1,主从门控模式的介绍
STM32的每个定时器都可以由另一个定时器触发启动定时器一般是通过软件设置而启动,STM32的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动.这里所谓某一个条件可以是定时到时、定时器超时、比较成功等许多条件.这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式。
从这个图中可以TIM3(master)控制TIM1(slave)需要将TIM1的ITR设置为ITR2
2,使用主从门控模式输出如下要求的波形
使用TIM3的CH1控制TIM1的CH1和CH2,每一个波的周期是25us,一组波的频率是10HZ
3,TIM的配置
TIM3:
从3,
4,代码实现
使用的芯片是stm32f051k6u6,HCLK= 48MHZ
/* TIM3 init function */static void MX_TIM3_Init(void){ TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim3.Instance = TIM3; htim3.Init.Prescaler = 480-1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 10020-1; //100ms一组 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 25;//10个波 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim3);}
/* TIM1 init function */static void MX_TIM1_Init(void){ TIM_SlaveConfigTypeDef sSlaveConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; htim1.Instance = TIM1; htim1.Init.Prescaler = 48-1; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 25-1; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED; sSlaveConfig.InputTrigger = TIM_TS_ITR2; //TIM3 control TIM1 if (HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 12; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim1);}
在main函数中:
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
在刚上电的时候PIN脚的电平我们可以在初始的时候拉高或者拉低:
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
但是PWM波输出停止之后的PIN脚的电平我们不容易控制,他跟PWM波停止时的电平状态相关,可以使用PIN重新初始化的方式,但是需要耗费较长的时间。
0 0
- 使用stm32主从门控模式精确控制脉冲个数
- stm32主从模式定时器产生精确脉冲个数
- stm32PWM精确控制脉冲个数
- stm32 精确个数高速脉冲输出
- 基于SM32的脉冲输出定位控制(精确脉冲个数控制,PWM)
- stm32使用PWM波中断的方式精确的控制波的个数
- Kinetis FTM PWM波 脉冲个数控制
- stm32使用systick精确延时
- STM32控制步进电机实现精确转动
- stm32的I2C主从模式
- 门控时钟的使用
- 使用STM32的定时器进行输入脉冲的计数
- 使用STM32定时器生成类光电编码器ABZ相脉冲
- STM32使用Systick 实现精确定时
- STM32使用systick实现精确延时
- 脉冲控制收发
- STM32定时器单脉冲输出
- stm32-定时器-脉冲捕获功能
- 论go语言中goroutine的使用
- java基础学习(十)容器-1
- 熄灯之后的学习——再读《MySQL必知必会》(4)|| 排序数据
- Struts2-Action-8-系列问题(包含模块配置文件、defaultAction)
- SAP SMP iOS kapsel打包注意事项
- 使用stm32主从门控模式精确控制脉冲个数
- 蓝桥杯 圆的面积 java
- PAT-A-1070. Mooncake (25)
- rabbitmq的命令和Web UI管理消息服务器
- 1002. A+B for Polynomials (25)
- Linux中用户管理
- Oracle基本概念
- Springboot + Devtools(热部署)
- 可重入函数