首页 > 其他分享 >stm32 TIM输出比较(OC) PWM

stm32 TIM输出比较(OC) PWM

时间:2024-03-12 11:13:53浏览次数:24  
标签:TypeDef void OC stm32 TIM uint16 GPIO TIMx

stm32 P6-4  05:00   ([6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱动直流电机_哔哩哔哩_bilibili

1.stm32f10x.tim.h 部分头文件讲解

void TIM_DeInit(TIM_TypeDef* TIMx);
​​​​​​​void TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);       //用来配置输出比较模块
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);  

 

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);          //输出比较结构体赋一个默认值

 

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);  //仅高级定时器使用,使用高级定时器输出pwm时,调用该函数,使能主输出,否则pwm不能正常输出

 

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);        //配置强制输出模式
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); 
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); 
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

 

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  //配置CCR寄存器预装功能,预装功能:影子寄存器,更新事件才会生效
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); 
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); 
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  

 

void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);      //配置快速使能
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); 
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); 
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); 


void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);        //外部事件时清除REF信号
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);


void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);    //单独设置输出比较极性,带N就是高级定时器互补通道的配置,OC4没有互补通道   
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);     
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);       
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);      //单独修改输出使能参数
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);    //单独修改输出使能参数
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);  //选择输出比较模式,单独更改输出比较模式



void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);          //单独更改CCR寄存器值
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);

 

顺序:

1.开起RCC时钟,把要用的TIM外设和GPIO外设的时钟打开;

 2.配置时机单元;

3.配置时机比较单元(CCR的值,输出比较模式,极性选择,输出使能);

 4.配置GPIO,初始化为复用推挽输出;

 5.运行控制,启动计数器,使能输出PWM; 

  •  PWM频率:    Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  • PWM占空比: Duty = CCR / (ARR + 1)
  • PWM分辨率: Reso = 1 / (ARR + 1)

 rcc开启时钟:

#include "stm32f10x.h" // Device header

void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);               //开启TIM2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //开启gpio端口时钟

// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           //复用推挽输出      对于普通的开漏推挽输出,引脚的控制权是来自于输出数据寄存器,想定时器控制引脚,需要使用复用开漏/推挽输出,输出控制权转移给偏上外设
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO_Pin_15;
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 = 720 - 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);              通道已初始化;借用了GPIOA PA0口(见stm32f103c8t6引脚定义),关注一下重映射

TIM_Cmd(TIM2, ENABLE);              //启动定时器

}

 void PWM_SetCompare1(uint16_t Compare)

{
  TIM_SetCompare1(TIM2, Compare);          //在运行时候单独更改通道1的CCR
}

标签:TypeDef,void,OC,stm32,TIM,uint16,GPIO,TIMx
From: https://www.cnblogs.com/NevMore/p/18041147

相关文章

  • 实例带你了解GaussDB数据库的LOCK TABLE
    本文分享自华为云社区《GaussDB数据库SQL系列-LOCKTABLE》,作者:酷哥。一、前言GaussDB是一款高性能、高可用的分布式数据库,广泛应用于各类行业和场景。在GaussDB中,锁是实现并发控制的关键机制之一,用于协调多个事务之间的数据访问,确保数据的一致性和完整性。本文将围绕GaussDB数......
  • STM32 LwIP学习过程问题总结(一):LwIP ping不通,抓包发现ICMP校验和为0x0000
    一、问题今天在将之前的STM32LwIP1.4.1版本程序移植到2.1.2版本上时,发现ping不同,但是开发板有ICMP回复包,黄颜色警告checksum为0x0000。说明LwIP移植应该是没问题,数据处理这一块出错了。 在网上找了下相关的错误,ST论坛有个问题和我这个一样。HardwareIPv4checksumonanST......
  • docker镜像的操作
    一:镜像镜像是docker里面三个重要之一的东西,里面是创建容器的只读模版,就像是一个独立的软件包,就是运行某个程序必备的代码即可;传统的镜像就是包括了整个操作系统副本以及预安装的应用软件镜像的拉取:#默认是拉取最新的镜像[root@qcy/]#dockerpullubuntuUsingdefaulttag:......
  • 常用的Docker命令及其用途简述
    记录常用的Docker命令及其用途在日常的开发和运维工作中,Docker和docker-compose已经成为了不可或缺的工具。它们帮助我们轻松地构建、运行和管理容器化的应用程序。在这篇随笔中,我将记录下一些我常用的Docker和docker-compose命令,并简述它们的用途,并在每一个命令后面加上一条示例......
  • python 使用PaddleOCR读取图片文字,并用pyttsx3转为音频
    python小白,纯纯小白,很久之前看了一遍菜鸟官网,但实在没有应用场景,所以过目即忘。最近工作不是很忙,给我出了个题目,觉得挺有意思,就玩一玩。  所以关键点就是,图片提取出文字,然后文字转音频。1.图片提取文字,PaddleOCR出题人士,给出了git上一个ocr的工具库,支持图文信息的抽取。用......
  • UVM宏解释+odt文件转doc+merge命令和difflib+python调用命令+clog2和系统函数+java添
    UVM宏解释UVM_DISABLE_AUTO_ITEM_RECORDINGhttps://blog.csdn.net/MGoop/article/details/127295965itemrecord的方法主要是用于记录事务信息的,原理是调用accept_tr,begin_tr,end_tr。似乎和波形上显示出各个事务相关。默认情况下,在调用get_next_item()和item_done()时自动......
  • 基于RocketMQ实现分布式事务
    背景在一个微服务架构的项目中,一个业务操作可能涉及到多个服务,这些服务往往是独立部署,构成一个个独立的系统。这种分布式的系统架构往往面临着分布式事务的问题。为了保证系统数据的一致性,我们需要确保这些服务中的操作要么全部成功,要么全部失败。通过使用RocketMQ实现分布式事......
  • 包含Maven和Docker的Dockerfile
    要创建一个包含Maven和Docker的Dockerfile,你需要首先明确你的需求。通常,这样的Dockerfile可能是为了构建并打包一个Java项目,然后使用Docker将其部署。以下是一个简单的示例,展示了如何创建一个Dockerfile,该Dockerfile安装了Maven和Docker,然后构建并推送一个Java项目:Dockerfile#......
  • JAVA常用类--AutoCloseable接口
    AutoCloseable接口自动关闭,释放资源机制在实际的项目开发过程中,一般都有可能连接到一些资源,比如:文件资源、网络资源、数据库资源,在实际项目之中进行资源访问的社会一般有如下几个操作步骤:不使用AutoCLoseable:手动定义关闭函数按照正常的结构设计来讲,当前的程序已经可以满足......
  • JAVA常用类--Runtime类
    Runtime类Runtime类描述的是一种运行时,在Java程序执行过程中,所有的java程序都一定要运行在JVM(虚拟机)的进程中有了JVM进程,就需要一种类型可以描述当前进程的相关环境以及与之相关的处理操作,即Java设计出了Runtime类每个JVM的进程中都会自动包含有一个Runtime类的实例化对象,打......