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

【STM32F103ZET6——库函数】6.PWM

目录

配置PWM输出引脚

使能引脚时钟

配置PWM

使能PWM

配置定时器

使能定时器时钟

使能定时器

例程

例程说明

main.h

main.c

PWM.h

PWM.c

led.h

led.c

DSQ.h

DSQ.c

配置PWM输出引脚

        PWM的输出引脚必须配置为复用功能

        注意:需要使用哪个引脚,必须得先查看数据手册,只有含有“TIMx_CHx”或者含有“TIMx_CHxN”的引脚才能用作PWM脉冲信号输出,并且对应引脚对应固定,不可变。(重点!!!重点!!!重点!!!)

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

//LED蓝灯 PB1引脚
GPIO_InitTypeDef GPIO;
GPIO.GPIO_Speed=GPIO_Speed_50MHz;
GPIO.GPIO_Pin=GPIO_Pin_1;
GPIO.GPIO_Mode=GPIO_Mode_AF_PP;//复用功能
GPIO_Init(GPIOB,&GPIO);

使能引脚时钟

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB1引脚时钟

配置PWM

  1. 配置PWM模式。模式1:计数值<CCR时,通道1为有效电平。模式2:计数值>CCR时,通道1为有效电平。

  2. 比较输出使能

  3. 配置输出比较极性。0:高电平有效。1:低电平有效。

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);
/*
CHx->TIM_OCxInit
CH几就对应OC几

TIMx_->TIMx
TIMx_就对应定时器几
*/

//PB1 -> TIM3_CH4 -> TIM3、TIM_OC4Init
TIM_OCInitTypeDef PWM;
PWM.TIM_OCMode=TIM_OCMode_PWM2;//PWM模式2
PWM.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
PWM.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性
TIM_OC4Init(TIM3,&PWM);//初始化PWM

使能PWM

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
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);
/*
CHx->TIM_OCxInit
CH几就对应OC几

TIMx_->TIMx
TIMx_就对应定时器几
*/

//PB1 -> TIM3_CH4 -> TIM3、TIM_OC4PreloadConfig
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能PWM

配置定时器

根据对应的引脚定时器配置对应的定时器。

  1. 配置第一次时钟分频

  2. 配置计数模式

  3. 配置重载值

  4. 配置预分频系数

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

TIM_TimeBaseInitTypeDef DSQ_3;
DSQ_3.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频
DSQ_3.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式
DSQ_3.TIM_Period=900-1;//重载值,
DSQ_3.TIM_Prescaler=0;//预分频系数  
TIM_TimeBaseInit(TIM3,&DSQ_3);//定时器3初始化

使能定时器时钟

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟

使能定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

TIM_Cmd(TIM3,ENABLE);//使能定时器3

例程

例程说明

        使用定时器3的PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED[PB5]亮度由1档变5档,再又5档变1档,每个档位持续1秒,如此循环。

main.h

#ifndef _MAIN_H_
#define _MAIN_H_

#include "stm32f10x.h"                  // Device header
#include "stm32f10x_gpio.h"             // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_tim.h"              // Keil::Device:StdPeriph Drivers:TIM
#include <stm32f10x_rcc.h>
#include <stm32f10x_usart.h>
#include <stm32f10x_sdio.h>
#include <misc.h>
#include <stdio.h>
#include "timch.h"
#include "bsp_SysTick.h"

#include "delay.h"
#include "PWM.h"
#include "led.h"
#include "DSQ.h"

#endif

main.c

#include "main.h"

int main() {
	char i;
	u16 PWM[]={0,225,450,675,900};
	delay_init();
	LED_Init();
	DSQ_3_Init();
	PWM_Init();
    while(1){
		for(i=0;i<5;i++){
			TIM_SetCompare4(TIM3,PWM[i]);
			delay_ms(1000);
		}
		for(i=4;i>=0;i--){
			TIM_SetCompare4(TIM3,PWM[i]);
			delay_ms(1000);
		}
	}
}

PWM.h

#ifndef __PWM_H_
#define __PWM_H_

#include "stdio.h"
#include "sys.h"

void  PWM_Init();

#endif

PWM.c

#include "PWM.h"

void  PWM_Init(){
	TIM_OCInitTypeDef PWM;
	
	PWM.TIM_OCMode=TIM_OCMode_PWM2;//PWM模式2
	PWM.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
	PWM.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性
	TIM_OC4Init(TIM3,&PWM);//初始化PWM
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能PWM
}

led.h

#ifndef __LED_H_
#define __LED_H_

#include "stdio.h"
#include "sys.h"

void LED_Init();
void LED_ALL_OFF();
void LED_R_NO();
void LED_R_OFF();
void LED_G_NO();
void LED_G_OFF();
void LED_B_NO();
void LED_B_OFF();

#endif

led.c


#include "led.h"

void LED_Init(){
	GPIO_InitTypeDef GPIO;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	GPIO.GPIO_Pin=GPIO_Pin_5;
	GPIO.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO.GPIO_Speed=GPIO_Speed_50MHz;

	//GPIO_Init(GPIOB,&GPIO);
	//GPIO_SetBits(GPIOB,GPIO_Pin_5);

	GPIO.GPIO_Pin=GPIO_Pin_0;
	//GPIO_Init(GPIOB,&GPIO);
	//GPIO_SetBits(GPIOB,GPIO_Pin_0);

	GPIO.GPIO_Pin=GPIO_Pin_1;
	GPIO.GPIO_Mode=GPIO_Mode_AF_PP;//复用功能
	GPIO_Init(GPIOB,&GPIO);
	//GPIO_SetBits(GPIOB,GPIO_Pin_1);
}

void LED_ALL_OFF(){
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
	GPIO_SetBits(GPIOB,GPIO_Pin_0);
	GPIO_SetBits(GPIOB,GPIO_Pin_1);
}

void LED_R_NO(){
	GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}

void LED_R_OFF(){
	GPIO_SetBits(GPIOB,GPIO_Pin_5);
}

void LED_G_NO(){
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}

void LED_G_OFF(){
	GPIO_SetBits(GPIOB,GPIO_Pin_0);
}

void LED_B_NO(){
	GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}

void LED_B_OFF(){
	GPIO_SetBits(GPIOB,GPIO_Pin_1);
}

DSQ.h

#ifndef __DSQ_H_
#define __DSQ_H_

#include "stdio.h"
#include "delay.h"
#include "led.h"

void DSQ_1_Init();
void DSQ_3_Init();

#endif

DSQ.c

#include "DSQ.h"

void DSQ_1_Init(){
	TIM_TimeBaseInitTypeDef DSQ_1;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能定时器1时钟
	
	DSQ_1.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频
	DSQ_1.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式
	DSQ_1.TIM_Period=900-1;//重载值,
	DSQ_1.TIM_Prescaler=0;//预分频系数  
	TIM_TimeBaseInit(TIM1,&DSQ_1);//定时器1初始化
	//TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//定时器3计数值更新、溢出,使能
	TIM_Cmd(TIM1,ENABLE);//使能定时器3
}


void DSQ_3_Init(){
	TIM_TimeBaseInitTypeDef DSQ_3;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3时钟
	
	DSQ_3.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频
	DSQ_3.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式
	DSQ_3.TIM_Period=900-1;//重载值,
	DSQ_3.TIM_Prescaler=0;//预分频系数  
	TIM_TimeBaseInit(TIM3,&DSQ_3);//定时器3初始化
	//TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//定时器3计数值更新、溢出,使能
	TIM_Cmd(TIM3,ENABLE);//使能定时器3
}

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

相关文章:

  • 【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)
  • 蜈蚣博弈(Centipede Game)
  • Oracle性能调优(一):时间模型统计
  • 类似ComfyUI和Midjourney这样的文生图图生图应用的API与服务架构该怎么设计
  • 算法1-2 分数线划定
  • 【蓝桥杯集训·每日一题2025】 AcWing 5437. 拐杖糖盛宴 python
  • 【力扣】2626. 数组归约运算——认识循环
  • P1596 [USACO10OCT] Lake Counting S(深度优先搜索)
  • Matlab 大量接单
  • 神经网络在电力电子与电机控制中的应用
  • [含文档+PPT+源码等]精品基于Python实现的vue3+Django计算机课程资源平台
  • 卫星网络仿真平台:IPLOOK赋能空天地一体化通信新生态​
  • 【设计原则】里氏替换原则(LSP):构建稳健继承体系的黄金法则
  • 【第二十五周】:DeepPose:通过深度神经网络实现人体姿态估计
  • Redis详解(实战 + 面试)
  • unity中找不到AI > Navgation
  • 每日十个计算机专有名词 (7)
  • 警告⚠:await has no effect on the type of this expression.
  • Redis 的几个热点知识
  • 6-3-1JIT(即时编译器)