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

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

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内