【stm-4】PWM驱动LED呼吸灯 PWM驱动舵机PWM驱动直流电机

2024-05-09 01:44

本文主要是介绍【stm-4】PWM驱动LED呼吸灯 PWM驱动舵机PWM驱动直流电机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.PWM驱动LED呼吸灯 

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_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);        //仅高级定时器使用,在使用高级定时器输出PWM函数时调用。否则PWM不能正常输出 

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

//单独更改通道1的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)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "pwm.h"
#include "delay.h"
#include "OLED.h"
uint8_t i;
int main(void)
{OLED_Init();PWM_Init();while(1){for(i=0;i<=100;i++){PWM_setcompare1(i);	//通过单独改变通道1(PA0)的CCR值,PWM的占空比、分辨率、频率随之改变Delay_ms(10);}for(i=0;i<=100;i++){PWM_setcompare1(100-i);Delay_ms(10);}}
}

(2) pwm.c

#include "Device/Include/stm32f10x.h"   // Device header
void PWM_Init(void)
{
//根据PWM基本结构框图,时基单元初始化、输出比较单元选择(TIM1通道初始化)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的值。计10000个数TIM_TimeBaseInitstructure.TIM_Prescaler=720-1;//7200-1;//PSC.72MHZ下7200分频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);	//使用PA0口,对应第一个通道,使用OC1Init函数//TIM1通道初始化TIM_Cmd(TIM2,ENABLE);//计数器使能,启动定时器
}
void PWM_setcompare1(uint16_t compare)
{TIM_SetCompare1(TIM2,compare);
}

(3)pwm.h

#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_setcompare1(uint16_t compare);
#endif

2.PWM驱动舵机 

(1)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "servo.h"
#include "delay.h"
#include "OLED.h"
#include "key.h"
uint8_t i;
uint8_t KeyNum;
float Angle;
int main(void)
{OLED_Init();servo_Init();Key_Init();OLED_ShowString(1,1,"Angle:");while(1){KeyNum=Key_GetNumber();if(KeyNum==1){Angle+=30;if(Angle>180){Angle=0;}}servo_SetAngle(Angle);OLED_ShowNum(1,7,Angle,3);}
}

(2)pwm.c

#include "Device/Include/stm32f10x.h"   // Device header
void 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;	//用PA1口通道2GPIO_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的值。计10000个数TIM_TimeBaseInitstructure.TIM_Prescaler=72-1;//7200-1;//PSC.72MHZ下7200分频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_OC2Init(TIM2,&TIM_OCInitstructure);	//使用PA0口,对应第一个通道,使用OC1Init函数TIM_Cmd(TIM2,ENABLE);//计数器使能,启动定时器
}
void PWM_setcompare2(uint16_t compare)
{TIM_SetCompare2(TIM2,compare);
}

 (3)pwm.h

#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_setcompare2(uint16_t compare);
#endif

(2)servo.c

#include "Device/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);
}

(3)servo.h

#ifndef __SERVO_H
#define __SERVO_Hvoid servo_Init(void);
void servo_SetAngle(float Angle);#endif

3.PWM驱动直流电机 

(1)main.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "motor.h"
#include "delay.h"
#include "OLED.h"
#include "key.h"
uint8_t KeyNum;
uint8_t i;
int8_t speed;
int main(void)
{OLED_Init();motor_Init();Key_Init();OLED_ShowString(1,1,"speed:");while(1){KeyNum=Key_GetNumber();if(KeyNum==1){speed+=20;if(speed>100){speed=-100;}}Motor_SetSpeed(speed);OLED_ShowSignedNum(1,7,speed,3);}
}

(2)motor.c

#include "Device/Include/stm32f10x.h"   // Device header
#include "PWM.h"
void motor_Init(void)
{PWM_Init();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);
}
void Motor_SetSpeed(int8_t speed)	//正转反转有符号
{if(speed>=0){GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_setcompare3(speed);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOA,GPIO_Pin_5);PWM_setcompare3(-speed);}
}

 (3)motor.h

#ifndef __MOTOR_H
#define __MOTOR_Hvoid motor_Init(void);
void Motor_SetSpeed(int8_t speed);#endif

这篇关于【stm-4】PWM驱动LED呼吸灯 PWM驱动舵机PWM驱动直流电机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972040

相关文章

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统,而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备,并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线的 子设备。 标识和报告子设备的过程称为 总线枚举。 在总线枚举期间,总线驱动程序会为其子 设备创建设备对象 。  总线驱动程序本质上是同时处理总线枚

LED恒流调光电路

LED等在工作的时候发热较大,所以通常选用铝基板作为底板;常用白色油墨。 LED必须在恒流源电路下工作,下图为最简单的恒流源:B极电压3.3V不变左下侧蓝色的为稳压二极管,由于BE极可以看做二极管,压降为0.7V,所以R2间的压降为2.6V恒定,所以电流也就恒定: 电压的很小变化会造成电流的恒大变化,从而带来更大的发热和降低寿命: 常见的LED调光芯片: SM2082:

WDF驱动开发-特定于KMDF的技术(一)

这部分的技术是一些零散的记录知识点,它们主要是在WDF框架中特定于KMDF的部分。 将内核模式驱动程序框架和非 PnP 驱动程序配合使用 如果要为不支持 即插即用 (PnP) 的设备编写驱动程序,则驱动程序必须: 在 WDF_DRIVER_CONFIG 结构的 DriverInitFlags 成员中设置 WdfDriverInitNonPnpDriver 标志;提供 EvtDriverUnl

ADD属性驱动架构设计(一)

目录 一、架构设计过程 1.1、架构设计过程 1.1.1、设计目的 1.1.2、质量属性(非功能需求) 1.1.3、核心功能(功能需求) 1.1.4、架构关注 1.1.5、约束条件 1.2、基于设计过程 二、什么是ADD? 三、为什么选择ADD? 四、作用 五、ADD实现步骤 5.1、架构设计目标 5.1.1、系统类型确定  5.1.2、系统阶段确定 5.2、建

博通5720 windows server 2003 32位网卡驱动和系统

driver for DELL R320 Broadcom 5720 Windows 2003 32bit 本人安装windows server 2003 网卡驱动成功!! 提供方便网盘下载地址博通5720网卡驱动 : http://pan.baidu.com/s/1GQWpw  windows server 2003 ghost 系统: http://pan

无霍尔BLDC驱动

目前主要的无霍尔控制方案是基于反电势检测信 息判断换相点,本文研究反电势在 PWM - OFF 点的检 测方案确定换相点。 1. 反电动势检测方案 BLDC 的模型做等效,将线圈阻抗看成是一个 线性电阻和一个储能电感的等效,其等效电路图如图 1所示。 电机三相绕组输出端电压的电压方程组为 式中,LM = L - M; Ua0、Ub0和 Uc0为三相绕组输出端对直 流电源地的电压。e

嵌入式linux系统中LCD屏驱动实现思路分析

在 Linux 下 LCD 的使用更加广泛,在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。接下来就来学习一下如何在 Linux 下驱动 LCD 屏幕。                           第一:Framebuffer设备简介       先来回顾一下裸机的时候 LCD 驱动是怎么编写的,裸机 LCD 驱动编写流程如下: ①、初始化 I.MX6U

ESP32通过I2C驱动PCA9557IO扩展芯片

前言 ESP32自带的IO管脚比较有限,这个时候我们就需要使用一些IO扩展芯片扩展我们的IO,今天就介绍一款使用I2C接口扩展8个IO的芯片 PCA9557 PCA 9557芯片介绍 PCA9557是一款硅CMOS电路,为SMBus和I²C总线应用提供并行输入/输出扩展。PCA9557由8位输入端口寄存器、8位输出端口寄存器和I²C总线/SMBus接口组成。具有低电流消耗和高阻抗开漏输出引脚

ESP32使用按键配网并通过LED指示网络状态

前言 上面我们已经可以通过 ESPTOUCH 和 Airkiss 给模块配网,并且存储在 nvs 中,重启后仍然可以联网,只是这样仍然不能满足我们实际的应用,这次我们增加按键作为输入,LED作为输出,实现长按按键配网,并可以通过LED指示网络状态。 添加自己的组件 为了让程序结构更加清晰,所以我们在smart_config例程的基础上做了修改,在main文件夹里新建了main.c 、smar

STM32G030F6使用CubeMx配置PWM实验

1. 使用 CubeMx 创建 PWM 工程 打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject. 配置定时器 配置定时器1的通道1和通道2 产生PWM; 设置定时器1的主频:设置了( 63 + 1) 分频即定时器主频为1M 设置PWM定时的周期计数为 1000 即 1000HZ 设置通道一 翻转的计数值为 500 即