一: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输出模式以及编码器接口模式相关推荐

  1. STM32通用定时器输出PWM

    1 .TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时器预分 ...

  2. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  3. stm32 高级定时器产生PWM

    用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPW ...

  4. stm32通用定时器的PWM输出

    配置过程:(以TIM3为例,其CH1-CH4为:PA6.PA7.PB0.PB1) 1)开启TIM3时钟,配置4个IO口为复用推挽输出. 2)设置TIM3的ARR和PSC来控制PWM的周期. 3)设置T ...

  5. 【STM32】 定时器---正交解码编码器模式详解

    增量式编码器 增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号  通过读取单位时间脉冲信号的数 ...

  6. STM32f103C8定时器输出PWM波信号

    利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...

  7. HAL库教程10:定时器的PWM模式应用

      本节通过定时器的PWM模式驱动无源蜂鸣器,来演奏一段音乐.本博客在掌机的系列教程中介绍过蜂鸣器的驱动原理,感兴趣的可以参考电子琴 无源蜂鸣器驱动电路   蜂鸣器按照有无震荡源(不是电源),可以分为 ...

  8. 使用STC8H1K的高级PWM的正交编码器计数方式

    近期为了测试一些高分辨路的角度传感器,则需要对一些正交角度信号进行计量.在前面 HCTL2020 编码器电路板介绍了基于HCTL2020的计量方式.本文则测试直接使用8H1K28完成正交角度脉冲记录的 ...

  9. 编码器是什么?STM32编码器接口及应用编程

    关注.星标公众号,不错过精彩内容 作者:strongerHuang 微信公众号:strongerHuang 编码器是一种比较常见的产品(也可以理解为传感器),最常见的就是配合电机一起工作,那么,你对编 ...

最新文章

  1. 「JupyterNotebook」Jupyter中的程序调试方法
  2. Eclipse程序员要掌握的常用快捷键
  3. 细说ReactiveCocoa的冷信号与热信号(二):为什么要区分冷热信号
  4. Java数组3(2015-8-27)
  5. Java 容器源码分析之 ArrayList
  6. github上开源的UVCCamera为什么不能正常运行
  7. w3c 整站 php源码,W3C联盟系统 v1.3
  8. 解读《美国国家BIM标准》– BIM能力成熟度模型(六)
  9. Python 库学习 —— Excel存储(xlwt、xlrd)
  10. python能参加奥赛吗-家长分享孩子学习NOIP信息学奥赛的经历
  11. 6目摄像头照片球面投影变换拼接全景图片
  12. 【无线科普】802.11n 中HT20 HT40的区别和信道划分及plus,minus含义
  13. Python tkinter Text 多行文本框变化事件
  14. CPU—Time Profiler
  15. Dell 14R N4120笔记本电脑加固态硬盘
  16. 魔兽服务器排队微信,服务器排队严重:《魔兽世界》经典怀旧服执行47服免费角色转移计划...
  17. 基于微信小程序的车位预约设计与实现--毕业论文
  18. MySQL 多个in 条件需要注意的地方
  19. CSDN著名技术专家Visual C++2010开发体验心得——从Visual C++6 0到Visual C++201
  20. 2019 Q4中国公有云IaaS市场份额:阿里云、腾讯云、华为云三足鼎立

热门文章

  1. python绘制曲线y=2x+5_Python Matplotlib 简易教程
  2. 系统学习深度学习(二十六)--BiRNN
  3. jsp table 中多出行数据_数据分析 | 如何基于高斯曲线拟合15分钟生活圈距离衰减规律...
  4. wlop一张多少钱_求解实木家具沙发垫多少钱一张
  5. 【Java程序设计】输入输出
  6. 衡量失败检测算法的指标
  7. 依赖注入(DI)入门
  8. kafka reblance入门
  9. FTP:介绍、vsftpd搭建ftp、xshell使用xftp传输文件、pure-ftpd搭ftp
  10. Centos 5.6 安装subversion总结