首页 > 其他分享 >STM32学习笔记(五)--TIM输出比较PWM详解

STM32学习笔记(五)--TIM输出比较PWM详解

时间:2024-06-19 08:59:22浏览次数:22  
标签:TimeBaseInitStructure 舵机 -- STM32 TIM InitStructure OCInitStructure GPIO

(1)配置步骤
1.配置RCC外设时钟 开启GPIO以及TIM外设
2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元
3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等
4.配置GPIO口 初始化为复用式推挽输出的配置
5.运行控制 启动计数器 输出PWM

(2)代码示例
案例1(TIM_2CH1(PA0)通道输出PWM驱动LED呼吸灯)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
TIM_InternalClockConfig(TIM2);
	
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

TIM_OCInitTypeDef TIM_OCInitStructure;
//下面的是初始化结构体的函数,因为高级定时器跟普通定时器共用一个结构体
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
TIM_Cmd(TIM2, ENABLE);

//呼吸灯逻辑函数
for (i = 0; i <= 100; i++){
TIM_SetCompare1(TIM2,i);
Delay_ms(10);
}
for (i = 0; i <= 100; i++){
TIM_SetCompare1(TIM2,100-i);
Delay_ms(10);
}

案例2(TIM_2CH2(PA1)通道输出PWM驱动舵机)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
TIM_InternalClockConfig(TIM2);
	
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//已知以上数据的来源是由于舵机需要信号脉冲宽度为周期20MS	
//其次舵机分别在0.5ms 驱动舵机-90度
//舵机分别在0.5ms 驱动舵机-45度
//舵机分别在1.5ms 驱动舵机0度
//舵机分别在2ms 驱动舵机+45度
//舵机分别在2.5ms 驱动舵机+90度

//频率也就是1/0.02s=50HZ  CK_PSC时钟频率 PSC预分配 ARR自动重装值
//公式已知 PWM频率;  Freq=CK_PSC/(PSC+1)/(ARR+1)
//         PWM占空比;Duty=CRR/(ARR+1)
//         PWM分辨率;Reso=1/(ARR+1)
//则Freq=72MHZ/(PSC+1)/(ARR+1)=50HZ -> 72000 000HZ/(PSC+1)/(ARR+1)=50
//设PSC预分配为71 则原式72000 000/(71+1)/(ARR+1)=50  ARR=20000-1
//以上是根据自身自行设定的 最好可以多试试PSC*10的值 找到合适的
 
//所以算好了20MS周期的值 由于PSC固定 所以可以直接用来比值
//20MS / 20 000=0,5MS / x  20x=10 000 因为我们只需要比值X=500
//则舵机分别在0.5ms 驱动舵机-90度 CRR等于500
//舵机分别在0.5ms 驱动舵机-45度   CRR等于1000
//舵机分别在1.5ms 驱动舵机0度    CRR等于1500
//舵机分别在2ms 驱动舵机+45度    CRR等于2000
//舵机分别在2.5ms 驱动舵机+90度  CRR等于2500
TIM_OCInitTypeDef TIM_OCInitStructure;
//下面的是初始化结构体的函数,因为高级定时器跟普通定时器共用一个结构体
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
TIM_Cmd(TIM2, ENABLE);
//以上为配置的某些环节 具体函数位于程序中 本文档没有直接提供

案例3(TIM_2CH3(PA2)通道输出PWM驱动直流电机)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
TIM_InternalClockConfig(TIM2);

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//维持在20HZ-20KHZ(上述为20000HZ)人耳听不到电机声音 这样好点
TIM_OCInitTypeDef TIM_OCInitStructure;
//下面的是初始化结构体的函数,因为高级定时器跟普通定时器共用一个结构体
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	
TIM_Cmd(TIM2, ENABLE);
//以上为配置的某些环节 具体函数位于程序中 本文档没有直接提供

(3)函数分析
函数1:void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)(stm32f10x_tim.h)
该函数不同的GPIO口对应的通道不同函数名也不同,对于TIM_OCInitTypeDef的使用; 通用定时器选择参数如下。

序号

名称

参数解释

示例

参数1

TIM_OCMode

设置输出比较的模式

TIM_OCMode_PWM1

参数2

TIM_OCPolarity

设置输出比较的极性

TIM_OCPolarity_High

参数3

TIM_OutputState

设置输出的使能

TIM_OutputState_Enable

参数4

TIM_Pulse

设置CCR的参数

0

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

在引脚定义图里面去找对应的通道是多少,例如TIM_2CH1就是通道1,也可以去STM32CubeMX里面去看。

函数2:void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1) (stm32f10x_tim.h) 该函数不同的GPIO口对应的通道不同函数名也不同。

序号

名称

参数解释

示例

参数1

TIM_TypeDef* TIMx

定时器选择

TIM2

参数2

Compare1

通道选择

1、2、3、4

void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)

void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)

void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)

在引脚定义图里面去找对应的通道是多少,例如TIM_2CH1就是通道1,也可以去STM32CubeMX里面去看。

标签:TimeBaseInitStructure,舵机,--,STM32,TIM,InitStructure,OCInitStructure,GPIO
From: https://blog.csdn.net/weixin_64593595/article/details/139731643

相关文章

  • 笔记-python与鸭子
    首先介绍下面向对象(OOP)的三大特征:(1)面向对象程序设计有三大特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。这三个单词很常见,大家还是记住为好!(2)封装(Encapsulation):类包含了数据和方法,将数据和方法放在一个类中就构成了封装。(3)继承(Inheritance):Java是单继承......
  • 面试题-17.16 按摩师
    力扣题目解题思路java代码力扣题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。示例1:输入:[1,2,......
  • python代码生成器
    Python中可以使用多种方式实现代码生成器的功能,即基于模板生成代码或者文档。其中最常用的是Jinja2和Mako这两个模板引擎。下面我将展示如何使用Jinja2来实现一个简单的代码生成器。首先,确保你已经安装了Jinja2库。如果没有安装,可以通过pip安装:pipinstalljinja2然后,你......
  • 天才程序员周弈帆 | Stable Diffusion 解读(三):原版实现源码解读(篇幅略长,建议收藏!)
    本文来源公众号“天才程序员周弈帆”,仅用于学术分享,侵权删,干货满满。原文链接:StableDiffusion解读(三):原版实现源码解读天才程序员周弈帆|StableDiffusion解读(一):回顾早期工作-CSDN博客天才程序员周弈帆|StableDiffusion解读(二):论文精读-CSDN博客看完了StableDiffus......
  • MobaXterm的安装与使用(连接Ubuntu)
    1.简介MobaXterm是一款Windows平台下的终端软件,集成了很多功能,如SSH、telnet、RDP、VNC、FTP、SFTP、X11、以及Unix命令行环境等。它可以方便地管理远程服务器,并提供了图形化的文件传输和编辑功能。MobaXterm的主要特点包括:全面的网络工具:包括SSH、telnet、RDP、VN......
  • Vue 3中的ref:深入理解响应式引用
    ......
  • Vue 3中的reactive:响应式对象和数组
    ......
  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
     您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcgkKDskF......
  • Python做点击率数据预测
    点击率(Click-ThroughRate,CTR)预测是推荐系统、广告系统和搜索引擎中非常重要的一个环节。在这个场景中,我们通常需要根据用户的历史行为、物品的特征、上下文信息等因素来预测用户点击某个特定物品(如广告、推荐商品)的概率。1.点击率数据预测以下是一个简化的点击率预测示例,......
  • 29.4k star! linux命令大全,带示例,中文易懂!!!
    linux-commandLinux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。离线部署dockerrun--namelinux-command-itd-p9665:3000wcjiang/linux-command:latest离线访问http://localhost:9665/使用命令分类学习资源项目地址:https://github.com/......