STM32:配置定时器为PWM输出模式以及编码器接口模式
一:STM32的高级定时器TIM8配置为PWM输出模式
最近在工程项目中,需要用stm32的定时器 (以高级定时器TIM8为例 ) 产生两路PWM输出,作为电机的pwm输入,方法如下:
/*************初始化电机控制所需IO口**************/
void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能A口、B口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);//使能C口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PB0、1 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化PB//GPIO_ResetBits(GPIOB,GPIO_Pin_All);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; //PC4、5端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化PC}
/*************
说明:
只需两路PWM输出,分别是: TIM8->CH3和TIM8->CH4 两路通道
TIM8->CH3:对应引脚输出为PC 8
TIM8->CH4:对应引脚输出为PC 9
**************/
void Motor_PWM_Init(u16 arr,u16 psc)
{Motor_Init(); //初始化电机控制所需IOGPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_DeInit(TIM8); //初始化TIM8寄存器RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //使能定时器8时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能GPIO外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO复用功能模块时钟//设置引脚为复用功能,输出TIM8 -->\CH1 \CH2 的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //PC 6、7 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化PCTIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载周期值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据指定的参数初始化TIM8TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC 低电平有效 TIM_OC3Init(TIM8, &TIM_OCInitStructure); //根据指定的参数初始化外设TIM8TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH1 预装载使能TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC 低电平有效 TIM_OC4Init(TIM8, &TIM_OCInitStructure); //根据指定的参数初始化外设TIM8TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH2 预装载使能TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIM8在ARR上的预装载寄存器 TIM_CtrlPWMOutputs(TIM8,ENABLE); //MOE 主输出使能,高级定时器必须开启这个 TIM_Cmd(TIM8, ENABLE); //使能TIM8}
二:STM32的普通定时器TIM4配置为编码器接口模式
使用的是500线编码器(四条引线,分别为:A相、B相,电源线和GND),方案如下:
/**********把TIM4初始化为编码器接口模式****************/
void Encoder_Init_TIM4(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_DeInit(TIM4); //初始化TIM4寄存器RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能A、B、AFIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //PB6/7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化PB6/7TIM_TimeBaseStructure.TIM_Period = 65535; //设置自动重装载周期值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIM2//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级1级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1|TIM_Channel_2; //CC1S=01 选择输入端 IC1映射到TI1上
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //边沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
TIM_ICInit(TIM4, &TIM_ICInitStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM4->CNT = 0;
TIM_Cmd(TIM4, ENABLE); //启动TIM2定时器
}
STM32:配置定时器为PWM输出模式以及编码器接口模式相关推荐
- STM32通用定时器输出PWM
1 .TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时器预分 ...
- STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值
参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...
- stm32 高级定时器产生PWM
用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPW ...
- stm32通用定时器的PWM输出
配置过程:(以TIM3为例,其CH1-CH4为:PA6.PA7.PB0.PB1) 1)开启TIM3时钟,配置4个IO口为复用推挽输出. 2)设置TIM3的ARR和PSC来控制PWM的周期. 3)设置T ...
- 【STM32】 定时器---正交解码编码器模式详解
增量式编码器 增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号 通过读取单位时间脉冲信号的数 ...
- STM32f103C8定时器输出PWM波信号
利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...
- HAL库教程10:定时器的PWM模式应用
本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐.本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴 无源蜂鸣器驱动电路 蜂鸣器按照有无震荡源(不是电源),可以分为 ...
- 使用STC8H1K的高级PWM的正交编码器计数方式
近期为了测试一些高分辨路的角度传感器,则需要对一些正交角度信号进行计量.在前面 HCTL2020 编码器电路板介绍了基于HCTL2020的计量方式.本文则测试直接使用8H1K28完成正交角度脉冲记录的 ...
- 编码器是什么?STM32编码器接口及应用编程
关注.星标公众号,不错过精彩内容 作者:strongerHuang 微信公众号:strongerHuang 编码器是一种比较常见的产品(也可以理解为传感器),最常见的就是配合电机一起工作,那么,你对编 ...
最新文章
- 「JupyterNotebook」Jupyter中的程序调试方法
- Eclipse程序员要掌握的常用快捷键
- 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号
- Java数组3(2015-8-27)
- Java 容器源码分析之 ArrayList
- github上开源的UVCCamera为什么不能正常运行
- w3c 整站 php源码,W3C联盟系统 v1.3
- 解读《美国国家BIM标准》– BIM能力成熟度模型(六)
- Python 库学习 —— Excel存储(xlwt、xlrd)
- python能参加奥赛吗-家长分享孩子学习NOIP信息学奥赛的经历
- 6目摄像头照片球面投影变换拼接全景图片
- 【无线科普】802.11n 中HT20 HT40的区别和信道划分及plus,minus含义
- Python tkinter Text 多行文本框变化事件
- CPU—Time Profiler
- Dell 14R N4120笔记本电脑加固态硬盘
- 魔兽服务器排队微信,服务器排队严重:《魔兽世界》经典怀旧服执行47服免费角色转移计划...
- 基于微信小程序的车位预约设计与实现--毕业论文
- MySQL 多个in 条件需要注意的地方
- CSDN著名技术专家Visual C++2010开发体验心得——从Visual C++6 0到Visual C++201
- 2019 Q4中国公有云IaaS市场份额:阿里云、腾讯云、华为云三足鼎立
热门文章
- python绘制曲线y=2x+5_Python Matplotlib 简易教程
- 系统学习深度学习(二十六)--BiRNN
- jsp table 中多出行数据_数据分析 | 如何基于高斯曲线拟合15分钟生活圈距离衰减规律...
- wlop一张多少钱_求解实木家具沙发垫多少钱一张
- 【Java程序设计】输入输出
- 衡量失败检测算法的指标
- 依赖注入(DI)入门
- kafka reblance入门
- FTP:介绍、vsftpd搭建ftp、xshell使用xftp传输文件、pure-ftpd搭ftp
- Centos 5.6 安装subversion总结