【STM32】STM32学习笔记-PWM驱动LED呼吸灯 舵机 直流电机(16)

00. 目录

文章目录

    • 00. 目录
    • 01. 输出比较相关API
      • 1.1 TIM_OC1Init
      • 1.2 TIM_OCInitTypeDef结构体
      • 1.3 TIM_OCMode
      • 1.4 TIM_OutputState
      • 1.5 TIM_OutputNState
      • 1.6 TIM_OCPolarity
      • 1.7 TIM_OCNPolarity
      • 1.8 TIM_OCPolarity
      • 1.9 TIM_OCNPolarity
    • 02. PWM实现呼吸灯接线图
    • 03. PWM实现呼吸灯示例
    • 04. PWM驱动舵机接线图
    • 05. PWM驱动舵机示例
    • 06. PWM驱动直流电机接线图
    • 07. PWM驱动直流电机示例
    • 08. 源码下载
    • 09. 附录

01. 输出比较相关API

1.1 TIM_OC1Init

/*** @brief  Initializes the TIMx Channel1 according to the specified*         parameters in the TIM_OCInitStruct.* @param  TIMx: where x can be  1 to 17 except 6 and 7 to select the TIM peripheral.* @param  TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure*         that contains the configuration information for the specified TIM peripheral.* @retval None*/
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
功能:根据 TIM_OCInitStruct 中指定的参数初始化外设 TIMx
参数:TIMx:x 可以是 23 或者 4,来选择 TIM 外设TIM_OCInitStruct:指向结构TIM_OCInitTypeDef 的指针,包含了TIMx时间基数单位的配置信息    
返回值:

1.2 TIM_OCInitTypeDef结构体

/** * @brief  TIM Output Compare Init structure definition  */typedef struct
{uint16_t TIM_OCMode;        /*!< Specifies the TIM mode.This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */uint16_t TIM_OutputState;   /*!< Specifies the TIM Output Compare state.This parameter can be a value of @ref TIM_Output_Compare_state */uint16_t TIM_OutputNState;  /*!< Specifies the TIM complementary Output Compare state.This parameter can be a value of @ref TIM_Output_Compare_N_state@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register. This parameter can be a number between 0x0000 and 0xFFFF */uint16_t TIM_OCPolarity;    /*!< Specifies the output polarity.This parameter can be a value of @ref TIM_Output_Compare_Polarity */uint16_t TIM_OCNPolarity;   /*!< Specifies the complementary output polarity.This parameter can be a value of @ref TIM_Output_Compare_N_Polarity@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_Idle_State@note This parameter is valid only for TIM1 and TIM8. */uint16_t TIM_OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State@note This parameter is valid only for TIM1 and TIM8. */
} TIM_OCInitTypeDef;

1.3 TIM_OCMode

/** @defgroup TIM_Output_Compare_and_PWM_modes * @{*/#define TIM_OCMode_Timing                  ((uint16_t)0x0000)
#define TIM_OCMode_Active                  ((uint16_t)0x0010)
#define TIM_OCMode_Inactive                ((uint16_t)0x0020)
#define TIM_OCMode_Toggle                  ((uint16_t)0x0030)
#define TIM_OCMode_PWM1                    ((uint16_t)0x0060)
#define TIM_OCMode_PWM2                    ((uint16_t)0x0070)

1.4 TIM_OutputState

/** @defgroup TIM_Output_Compare_state * @{*/#define TIM_OutputState_Disable            ((uint16_t)0x0000)
#define TIM_OutputState_Enable             ((uint16_t)0x0001)

1.5 TIM_OutputNState


/** @defgroup TIM_Output_Compare_N_state * @{*/#define TIM_OutputNState_Disable           ((uint16_t)0x0000)
#define TIM_OutputNState_Enable            ((uint16_t)0x0004)

1.6 TIM_OCPolarity

/** @defgroup TIM_Output_Compare_Polarity * @{*/#define TIM_OCPolarity_High                ((uint16_t)0x0000)
#define TIM_OCPolarity_Low                 ((uint16_t)0x0002)

1.7 TIM_OCNPolarity

/** @defgroup TIM_Output_Compare_N_Polarity * @{*/#define TIM_OCNPolarity_High               ((uint16_t)0x0000)
#define TIM_OCNPolarity_Low                ((uint16_t)0x0008)

1.8 TIM_OCPolarity

/** @defgroup TIM_Output_Compare_Idle_State * @{*/#define TIM_OCIdleState_Set                ((uint16_t)0x0100)
#define TIM_OCIdleState_Reset              ((uint16_t)0x0000)

1.9 TIM_OCNPolarity

/** @defgroup TIM_Output_Compare_N_Idle_State * @{*/#define TIM_OCNIdleState_Set               ((uint16_t)0x0200)
#define TIM_OCNIdleState_Reset             ((uint16_t)0x0000)

02. PWM实现呼吸灯接线图

在这里插入图片描述

03. PWM实现呼吸灯示例

pwm.h

#ifndef __PWM_H__#define __PWM_H__#include "stm32f10x.h"  void pwm_init(void);void pwm_setCompare(uint16_t compare1);#endif /*__PWM_H__*/

pwm.c

#include "pwm.h"//PWM初始化
void pwm_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;NVIC_InitTypeDef NVIC_InitStruct;GPIO_InitTypeDef GPIO_InitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;//1. 开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO初始化  PA0GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//2. 开启定时器2内部时钟TIM_InternalClockConfig(TIM2);//3. 初始化定时器TIM_TimeBaseInitStruct.TIM_Period = 100 - 1;	  //ARRTIM_TimeBaseInitStruct.TIM_Prescaler = 720 - 1;  //预分频  PSCTIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //高级定时器使用TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);TIM_OCStructInit(&TIM_OCInitStruct);TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 20;	//CCRTIM_OC1Init(TIM2, &TIM_OCInitStruct);//7. 使能定时器TIM_Cmd(TIM2, ENABLE);
}void pwm_setCompare(uint16_t compare1)
{TIM_SetCompare1(TIM2, compare1);
}

main.c

#include "stm32f10x.h"#include "delay.h"
#include "oled.h"
#include "pwm.h"void pwm_setCompare(uint16_t compare1);int16_t num;uint16_t i;int main(void){		 //初始化OLED_Init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);pwm_init();OLED_ShowString(1, 1, "num:");while (1){for (i = 0; i <= 100; i++){pwm_setCompare(i);delay_ms(10);}for (i = 0; i <= 100; i++){pwm_setCompare(100 - i);delay_ms(10);}}return 0;}

04. PWM驱动舵机接线图

在这里插入图片描述

05. PWM驱动舵机示例

pwm.h

#ifndef __PWM_H
#define __PWM_Hvoid PWM_Init(void);
void PWM_SetCompare2(uint16_t Compare);#endif

pwm.c

#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{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;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSCTIM_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;		//CCRTIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_Cmd(TIM2, ENABLE);
}void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM2, Compare);
}

Servo.h

#ifndef __SERVO_H
#define __SERVO_Hvoid Servo_Init(void);
void Servo_SetAngle(float Angle);#endif

Servo.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"uint8_t KeyNum;
float Angle;int main(void)
{OLED_Init();Servo_Init();Key_Init();OLED_ShowString(1, 1, "Angle:");while (1){KeyNum = Key_GetNum();if (KeyNum == 1){Angle += 30;if (Angle > 180){Angle = 0;}}Servo_SetAngle(Angle);OLED_ShowNum(1, 7, Angle, 3);}
}

06. PWM驱动直流电机接线图

在这里插入图片描述

07. PWM驱动直流电机示例

pwm.h

#ifndef __PWM_H__#define __PWM_H__#include "stm32f10x.h"  void pwm_init(void);void pwm_setCompare(uint16_t compare1);#endif /*__PWM_H__*/

pwm.c

#include "pwm.h"//PWM初始化
void pwm_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;GPIO_InitTypeDef GPIO_InitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;//1. 开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO初始化  PA0GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//2. 开启定时器2内部时钟TIM_InternalClockConfig(TIM2);//3. 初始化定时器TIM_TimeBaseInitStruct.TIM_Period = 100 - 1;	  //ARRTIM_TimeBaseInitStruct.TIM_Prescaler = 36 - 1;  //预分频  PSCTIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //高级定时器使用TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);TIM_OCStructInit(&TIM_OCInitStruct);TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 0;	//CCRTIM_OC3Init(TIM2, &TIM_OCInitStruct);//7. 使能定时器TIM_Cmd(TIM2, ENABLE);
}void pwm_setCompare(uint16_t compare)
{TIM_SetCompare3(TIM2, compare);
}

motor.h

#ifndef __MOTOR_H__#define __MOTOR_H__#include "stm32f10x.h"                  // Device headervoid motor_init(void);void motor_setSpeed(int8_t speed);#endif

motor.c

#include "motor.h"
#include "pwm.h"void motor_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO初始化  PA0GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP ;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);pwm_init();
}void motor_setSpeed(int8_t speed)
{if (speed >= 0){GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_ResetBits(GPIOA, GPIO_Pin_5);pwm_setCompare(speed);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOA, GPIO_Pin_5);pwm_setCompare(-speed);}}

main.c

#include "stm32f10x.h"#include "delay.h"
#include "oled.h"
#include "motor.h"
#include "key.h"uint8_t keyNum;int8_t speed = 0;int main(void){		 //初始化OLED_Init();motor_init();key_init();OLED_ShowString(1, 1, "speed:");while (1){keyNum = key_scan();if (1 == keyNum){speed += 20;if (speed > 100){speed = -100;}}motor_setSpeed(speed);OLED_ShowSignedNum(1, 7, speed, 3);}}

08. 源码下载

11-PWM驱动呼吸灯.rar

12-PWM驱动舵机.rar

13-PWM驱动直流电机.rar

09. 附录

参考: 【STM32】江科大STM32学习笔记汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/312351.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析

文章目录 一、LR分析法1、概念2、流程3、LR分析器结构及分析表构造1&#xff09;结构2&#xff09;一些概念 二、LR(0)分析法1、流程2、分析动作1&#xff09;移近2&#xff09;归约(reduce) 3、总结1&#xff09;LR分析器2&#xff09;构造DFA3&#xff09;构造LR(0)的方法(三…

【一分钟】ThinkPHP v6.0 (poc-yaml-thinkphp-v6-file-write)环境复现及poc解析

写在前面 一分钟表示是非常短的文章&#xff0c;只会做简单的描述。旨在用较短的时间获取有用的信息 环境下载 官方环境下载器&#xff1a;https://getcomposer.org/Composer-Setup.exe 下载文档时可以设置代理&#xff0c;不然下载不上&#xff0c;你懂的 下载成功 cmd cd…

【动态规划】【字符串】C++算法:正则表达式匹配

作者推荐 视频算法专题 涉及知识点 动态规划 字符串 LeetCode10:正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是…

大数据应用领域:数据驱动一切

大数据出现的时间只有十几年&#xff0c;被人们广泛接受并应用只有几年的时间&#xff0c;但就是这短短几年的时间&#xff0c;大数据呈现出爆炸式增长的态势。在各个领域&#xff0c;大数据的身影几乎无处不在。今天我们通过一些大数据典型的应用场景分析&#xff0c;一起来看…

C练习——爱因斯坦台阶问题(穷举法)

题目&#xff1a;爱因斯坦曾经提出过这样一道有趣的数学题&#xff1a;有一个长阶梯&#xff0c;若每步上2阶&#xff0c;最后剩下1阶&#xff1b;若每步上3阶&#xff0c;最后剩2阶&#xff1b;若每步上5阶&#xff0c;最后剩下4阶&#xff1b;若每步上6阶&#xff0c;最后剩5…

浅析xxl-obj分布式任务调度平台RCE漏洞

文章目录 前言本地环境搭建1、初始化数据库2、搭建调度中心3、搭建出执行器 XXL-JOB漏洞1、后台弱口令->RCE2、未授权API->RCE3、默认accessToken4、CVE-2022-361575、SSRF漏洞->RCE 总结 前言 在日常开发中&#xff0c;经常会用定时任务执行某些不紧急又非常重要的事…

软件测试/测试开发丨Python 内置库 sys 学习笔记分享

sys 概述 是 Python 自带的内置模块是与 Python 解释器交互的桥梁 sys 使用 常用属性常用方法导入 sys 模块 # 导入sys模块 import sys# 查看sys模块帮助文档 help(sys)# 查看sys模块的属性和方法 print(dir(sys))sys 常用属性 sys.version&#xff1a;返回 Python 解释器…

个人博客主题 vuepress-hope

文章目录 1. 简介2. 配置2.1 个人博客&#xff0c;社媒链接配置 非常推荐vuepress-hope 1. 简介 下面的我的博客文章的截图 通过md写博客并且可以同步到github-page上 2. 配置 2.1 个人博客&#xff0c;社媒链接配置 配置文件 .vuepress/theme.ts blog: {medias: {BiliB…

【漏洞复现】企望制造ERP系统 RCE漏洞

漏洞描述 企望制造ERP系统是畅捷通公司开发的一款领先的生产管理系统&#xff0c;它以集成化管理为核心设计理念&#xff0c;通过模块化机制&#xff0c;帮助企业实现生产、采购、库存等方面的高效管理。该系统存在RCE远程命令执行漏洞&#xff0c;恶意攻击者可利用此漏洞进行…

设计模式:抽象工厂模式(讲故事易懂)

抽象工厂模式 定义&#xff1a;将有关联关系的系列产品放到一个工厂里&#xff0c;通过该工厂生产一系列产品。 设计模式有三大分类&#xff1a;创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…

MongoDB的基本使用

MongoDB的引出 使用Redis技术可以有效的提高数据访问速度&#xff0c;但是由于Redis的数据格式单一性&#xff0c;无法操作结构化数据&#xff0c;当操作对象型的数据时&#xff0c;Redis就显得捉襟见肘。在保障访问速度的情况下&#xff0c;如果想操作结构化数据&#xff0c;…

金蝶云星空其他出库单,审核中/审批流中可以选择序列号设置

文章目录 其他出库单&#xff0c;审核中&#xff0c;审批流中可以选择序列号设置 其他出库单&#xff0c;审核中&#xff0c;审批流中可以选择序列号设置