合肥中科深谷嵌入式项目实战——人工智能与机械臂(六)

2023-11-06 21:30

本文主要是介绍合肥中科深谷嵌入式项目实战——人工智能与机械臂(六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+
  • python项目实战

    Python编程基础教程系列(零基础小白搬砖逆袭)

  • 作者:爱吃饼干的小白鼠。Python领域优质创作者,2022年度博客新星top100入围,荣获多家平台专家称号。

🌟 最近更新

合肥中科深谷嵌入式项目实战——人工智能与机械臂(五)

目录

🌟 最近更新

⭐️硬件PWM驱动呼吸灯

🌟PWM

🌟PWM原理

🌟pwm驱动呼吸灯

🌟什么是呼吸灯

🌟代码实现

🌟pwm.h文件

🌟pwm.c文件 

🌟main.c文件

⭐️总结


⭐️硬件PWM驱动呼吸灯

我们前面和大家介绍了定时器原理和按键消抖的相关知识,今天,我们来说说硬件PWM驱动呼吸灯,下一篇,会介绍舵机的控制。

🌟PWM

我们既然学习硬件PWM驱动呼吸灯,那么什么是PWM呢。

PWM是Pulse Width Modulation的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式。其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器。 PWM是一种对模拟信号电平进行数字编码的方法,通过高分辨率计数器的使用,实现对一个模拟信号的电平进行编码,这个编码信号在范围上在0(包含0)到最大值(在更高位分辨率的情况下可以是小数)之间变化。 具体来说,PWM是一种周期性重复的模拟信号,它通过调节开关的占空比来控制输出电平。

🌟PWM原理

以STM32单片机为例,其IO口只能输出高电平和低电平。

假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。

电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。

🌟pwm驱动呼吸灯

🌟什么是呼吸灯

 在人眼辨识能力范围内,调节LED亮的时间,达到LED灯的亮度不同。例:给低电平LED就亮,如果一个脉冲中全是低电平那么LED最亮,如果一个脉冲一半是高电平,一半是低电平,那么LED就显得有点暗,这样调整脉冲中的高低电平的比例就可以达到LED的亮度调节。

通俗一点讲就是: LED灯逐渐由暗变亮,接着由亮变暗

一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是误以为是一个常亮的LED灯。

由于频率很高时看不到闪烁,占空比越大LED越亮,占空比越小LED越暗。所以,在频率一定时,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。

🌟代码实现

总体思路:

  1. 开启时钟,开启定时器时钟和GPIO时钟。
  2. 初始化时基单元。初始化ARR和PSC的值。
  3. 初始化GPIO,PWM要通过GPIO输出,配置GPIO。
  4. 初始化输出比较模块。选择通道,初始化输出比较结构体。
  5. 启动定时器。启动后就开始输出PWM波形了。

🌟pwm.h文件

#ifndef __PWM_H_
#define __PWM_H_
#include "stm32f4xx.h"void Pwm_Init(void);#endif

 这段代码的目的是声明一个函数Pwm_Init(),以供其他C文件使用,并在包含此头文件的任何源文件中都可用。

🌟pwm.c文件 

#include "pwm.h"void Pwm_Init(void)
{GPIO_InitTypeDef  	GPIO_InitStruct;TIM_OCInitTypeDef 	TIM_OCInitStruct;TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//初始化GPIOF组时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//初始化PF10引脚GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_9;  		//引脚10 LED1GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF;		//复用GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP; 	//推挽GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;  	//上拉GPIO_Init(GPIOF,&GPIO_InitStruct);	//3、引脚功能映射GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //4、初始化定时器,配置ARR,PSC。TIM_TimeBaseInitStruct.TIM_Prescaler	= 84-1; 	//分频系统  84MHZ/84 = 1MHZ  每秒数1000 000数 1us数一个数 TIM_TimeBaseInitStruct.TIM_Period		= 500-1; 	//重装值 500数,用时500usTIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up; //向上计数TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);		TIM_OCInitStruct.TIM_OCMode		=  TIM_OCMode_PWM1; 	  //PWM1模式TIM_OCInitStruct.TIM_OutputState=  TIM_OutputState_Enable;//输出使能TIM_OCInitStruct.TIM_OCPolarity =  TIM_OCPolarity_Low; 	  //极性低TIM_OC1Init(TIM14,&TIM_OCInitStruct);TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); 	TIM_ARRPreloadConfig(TIM14,ENABLE);	//7、使能定时器。TIM_Cmd(TIM14,ENABLE);
}

 我们这里是初始化一个PWM(脉宽调制)信号的函数,它使用STM32F4系列微控制器的TIM14定时器,并设置了一个LED连接到GPIOF的第9引脚。

🌟main.c文件

#include "stm32f4xx.h"
#include "led.h"
#include "pwm.h"//延时
void delay_ms(int ms)
{int i,j;for(i=0; i<ms; i++)for(j=0; j<10000;j++);
}//主函数
int main(void)
{int i;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LED_Init();//初始化LEDPwm_Init();//设置定时器4输出PWMwhile(1){//从暗到亮for(i=1; i<499; i++){TIM_SetCompare1(TIM14,i);delay_ms(20);}//从亮到暗for(i=499; i>0; i--){TIM_SetCompare1(TIM14,i);delay_ms(20);}}return 0;
}

 这里的代码就比较简单了,我们先初始化灯,然后初始化PWM,在while里面实现呼吸灯效果,先从暗到灭,然后,从灭到亮。

⭐️总结

  1. 了解呼吸灯的工作原理:呼吸灯通常使用LED作为光源,通过控制LED的亮度变化来模拟呼吸的效果。为了实现这一效果,可以使用PWM(脉冲宽度调制)来控制LED的亮度。
  2. 选择合适的PWM引脚:选择一个具有PWM功能的GPIO引脚来控制呼吸灯。在STM32F4系列微控制器中,通常使用TIM14定时器来实现PWM。
  3. 配置GPIO引脚和定时器:在代码中,需要配置GPIOF的第9引脚为TIM14的通道,并初始化TIM14定时器,设置PWM的频率和占空比。
  4. 控制呼吸灯的亮度:通过改变PWM的占空比,可以控制LED的亮度。占空比越高,LED越亮;占空比越低,LED越暗。
  5. 实现呼吸效果:通过在程序中动态调整PWM的占空比,使LED的亮度从最大值逐渐降低到最小值,然后再逐渐恢复到最大值,从而模拟呼吸的效果。

总结起来,完成硬件PWM驱动呼吸灯项目需要了解呼吸灯的工作原理、选择合适的PWM引脚、配置GPIO引脚和定时器、控制呼吸灯的亮度、实现呼吸效果等方面的知识和技能。

我们下一篇来介绍硬件PWM驱动舵机,其实原理都是一样的。

这篇关于合肥中科深谷嵌入式项目实战——人工智能与机械臂(六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习