当前位置: 首页 > article >正文

stm32定时器输出比较----驱动步进电机

定时器输出比较理论

  • OC(Output Compare)输出比较
  • 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
  • 每个高级定时器和通用定时器都拥有4个输出比较通道
  • 高级定时器的前3个通道额外拥有死区生成和互补输出的功能 

输出比较功能非常重要,主要用来输出PWM波形, PWM波形是驱动电机的必要条件,可以用来做智能车,机器人等项目

定时器配置

引脚配置,步进电机的驱动、方向、脉冲

/**
  * @brief  配置TIM复用输出PWM时用到的I/O
  * @param  无
  * @retval 无
  */
static void Stepper_GPIO_Config(void) 
{
	GPIO_InitTypeDef GPIO_InitStruct;
	/*开启Motor相关的GPIO外设时钟*/
	MOTOR_DIR_GPIO_CLK_ENABLE();
	MOTOR_PUL_GPIO_CLK_ENABLE();
	MOTOR_EN_GPIO_CLK_ENABLE();

	/*选择要控制的GPIO引脚*/															   
	GPIO_InitStruct.Pin = MOTOR_DIR_PIN;	
	/*设置引脚的输出类型为推挽输出*/
	GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  
	GPIO_InitStruct.Pull =GPIO_PULLUP;
	/*设置引脚速率为高速 */   
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	/*Motor 方向引脚 初始化*/
	HAL_GPIO_Init(MOTOR_DIR_GPIO_PORT, &GPIO_InitStruct);	

	/*Motor 使能引脚 初始化*/
	GPIO_InitStruct.Pin = MOTOR_EN_PIN;	
	HAL_GPIO_Init(MOTOR_EN_GPIO_PORT, &GPIO_InitStruct);	

	/* 定时器通道1功能引脚IO初始化 */
	/*设置输出类型*/
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	/*设置引脚速率 */ 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	/*设置复用*/
	GPIO_InitStruct.Pull =GPIO_PULLUP;
	/*选择要控制的GPIO引脚*/	
	GPIO_InitStruct.Pin = MOTOR_PUL_PIN;
	/*Motor 脉冲引脚 初始化*/
	HAL_GPIO_Init(MOTOR_PUL_PORT, &GPIO_InitStruct);			
}

定时器初始化和输出比较模式(翻转模式)配置

初始化

void TIM_PWMOUTPUT_Config(void)
{
	TIM_OC_InitTypeDef  TIM_OCInitStructure;  	
	/*使能定时器*/
	MOTOR_PUL_CLK_ENABLE();

	TIM_StepperHandle.Instance = MOTOR_PUL_TIM;    
	/* 累计 TIM_Period个后产生一个更新或者中断*/		
	///当定时器从0计数到TIM_PERIOD-1,即为TIM_PERIOD次,为一个定时周期
	TIM_StepperHandle.Init.Period = TIM_PERIOD-1; 
	//定时器时钟源TIMxCLK = 2 * PCLK1  
	//				PCLK1 = HCLK / 2 
	//				=> TIMxCLK=HCLK/2=SystemCoreClock/2*2=72MHz
	// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
	TIM_StepperHandle.Init.Prescaler = TIM_PRESCALER-1;

	/*计数方式*/
	TIM_StepperHandle.Init.CounterMode = TIM_COUNTERMODE_UP;            
	/*采样时钟分频*/	
	TIM_StepperHandle.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;   
	TIM_StepperHandle.Init.RepetitionCounter = 0 ;  		
	/*初始化定时器*/
	HAL_TIM_OC_Init(&TIM_StepperHandle);

	/*PWM模式配置--这里配置为输出比较模式*/
	TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE; 
	/*比较输出的计数值*/
	TIM_OCInitStructure.Pulse = OC_Pulse_num;
	/*当定时器计数值小于CCR1_Val时为高电平*/
	TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;          
	/*设置互补通道输出的极性*/
	TIM_OCInitStructure.OCNPolarity = TIM_OCNPOLARITY_LOW; 
	/*快速模式设置*/
	TIM_OCInitStructure.OCFastMode = TIM_OCFAST_DISABLE;   
	/*空闲电平*/
	TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_RESET;  
	/*互补通道设置*/
	TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_RESET; 
	HAL_TIM_OC_ConfigChannel(&TIM_StepperHandle, &TIM_OCInitStructure, MOTOR_PUL_CHANNEL_x);

	/* 确定定时器 */
	HAL_TIM_Base_Start(&TIM_StepperHandle);
	/* 启动比较输出并使能中断 */
	HAL_TIM_OC_Start_IT(&TIM_StepperHandle,MOTOR_PUL_CHANNEL_x);
	/*使能比较通道*/
	TIM_CCxChannelCmd(MOTOR_PUL_TIM,MOTOR_PUL_CHANNEL_x,TIM_CCx_ENABLE);

}

定时器_回调函数_全部如下

/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions
  *  @brief   TIM Callbacks functions
  * @{
  */
/* Callback in non blocking modes (Interrupt and DMA) *************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim);
void HA

http://www.kler.cn/a/451195.html

相关文章:

  • leetcode hot100 将有序数组转化为二叉搜索树
  • 修改el-select下拉框高度;更新:支持动态修改
  • 重温设计模式--2、设计模式七大原则
  • “檢測到不安全的代理”怎麼修復?
  • vue中proxy代理配置(测试二)
  • 学习threejs,THREE.PlaneGeometry 二维平面几何体
  • 时频转换 | Matlab暂态提取变换transient-extracting transform一维数据转二维图像方法
  • VUE 3.0 如何新建项目 详细教程 附环境搭建 推荐
  • SAP SD销售订单处理流程
  • 《探秘 OpenCV 各版本的奇妙世界》
  • 施耐德变频器ATV320系列技术优势:创新与安全并重
  • React 第十九节 useLayoutEffect 用途使用技巧注意事项详解
  • 大语言模型中的Agent优势及相关技术;Agent和RAG区别
  • 对BG兼并点的理解-不断刷新版
  • golangci-lint安装与Goland集成
  • 《算法》题目
  • 13. 导出与导入镜像
  • 边缘计算收益稳定
  • 信息安全技术——物理环境与设备安全、虚拟专用网
  • 【YashanDB知识库】XMLAGG方法的兼容
  • DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(二)
  • Refusal in Language Models Is Mediated by a Single Direction
  • GESP CCF C++五级编程等级考试认证真题 2024年12月
  • 第20天:JS信息收集-Web应用JS架构URL提取数据匹配Fuzz接口WebPack分析自动化
  • springboot-starter版本升级es版本问题
  • 目标检测——基于yolov8和pyqt的螺栓松动检测系统