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

news2024/11/29 5:43:36
  • 订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+
  • python项目实战

    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 LED1
	GPIO_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数,用时500us
	TIM_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();//初始化LED
	Pwm_Init();//设置定时器4输出PWM
	
	while(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.coloradmin.cn/o/1174695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑提示x3daudio1 7.dll丢失怎么修复,分享5个有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“x3daudio1 7.dll丢失”。x3daudio1 7.dll是DirectX的一个组件&#xff0c;它负责处理音频输出和输入的相关功能。这个错误通常会导致软件无法启动&#xff0c;音频播放出现问题&#xff0c…

前端框架Vue学习 ——(七)Vue路由(Vue Router)

文章目录 Vue路由使用场景Vue Router 介绍Vue Router 使用 Vue路由使用场景 使用场景&#xff1a;如下图&#xff0c;点击部门管理的时候显示部门管理的组件&#xff0c;员工管理的时候显示员工管理的组件。 前端路由&#xff1a;指的是 URL 中的 hash(#号)与组件之间的对应关…

JAVA应用中线程池设置多少合适?

目录 1、机器配置&#xff1a; 2、核心线程数 3、最大线程数多少合适&#xff1f; 4、理论基础 5、测试验证 一个线程跑满一个核心的利用率 6个线程 12 个线程&#xff1a;所有核的cpu利用率都跑满 有io操作 6、计算公式 7、决定最大线程数的流程&#xff1a; 1、机器…

【CAN通信栈基础】针对CAN通信栈,浅谈操作系统中断和轮询之间的区别和优劣

1. 前言 在操作系统中(例如AUTOSAR OS),中断和轮询是处理需要快速行动的事件的两种方法。中断是通过向CPU发送立即采取行动的信号来通知CPU需要注意的事件,而轮询则是CPU不断检查设备状态以确定是否需要CPU的注意。本文将详细探讨CAN通信中断和轮询之间的差异和优劣。 2.…

【ES专题】ElasticSearch集群架构剖析

目录 前言阅读对象阅读导航前置知识笔记正文一、ES集群架构1.1 为什么要使用ES集群架构1.2 ES集群核心概念1.2.1 节点1.2.1.1 Master Node主节点的功能1.2.1.2 Data Node数据节点的功能1.2.1.3 Master Node主节点选举流程 1.2.2 分片1.3 搭建三节点ES集群1.3.1 ES集群搭建步骤1…

java高级之单元测试、反射

1、Junit测试工具 Test定义测试方法 1.被BeforeClass标记的方法,执行在所有方法之前 2.被AfterCalss标记的方法&#xff0c;执行在所有方法之后 3.被Before标记的方法&#xff0c;执行在每一个Test方法之前 4.被After标记的方法&#xff0c;执行在每一个Test方法之后 public …

Grōk :马斯克 xAI 打造的 ChatGPT 竞争产品探索

本心、输入输出、结果 文章目录 Grōk &#xff1a;马斯克 xAI 打造的 ChatGPT 竞争产品探索前言Grōk 名称的解释Grōk AI 目前被曝光了 11 项功能超长prompt&#xff08;SuperPrompt&#xff09;支持个性化设置快速响应庞大的知识库实时搜索API接口语音就绪图像生成图像识别音…

【蓝桥杯省赛真题43】Scratch神奇哈哈镜 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch神奇哈哈镜 一、题目要求 编程实现 二、案例分析 1、角色分析

OCI制作

1.制作OCI包并运行容器 容器镜像本质上就是一个根文件系统镜像。但容器镜像又不仅仅是一个根文件系统镜像&#xff0c;容器镜像有一个OCI标准规范&#xff0c;而runc命令用于运行根据OCI规范打包的应用程序&#xff0c;也就是说&#xff0c;runc命令是OCI规范的兼容实现。 OCI容…

shell script函数function篇

function fname(){ 程序段 } #这个比较熟悉了&#xff0c;和其他计算机语言定义函数的格式都是相同的&#xff0c;上案例&#xff0c;自定义printf函数 总结&#xff1a;函数定义的格式&#xff0c;和其他语言大同小异&#xff0c;不同的是在函数调用方面&#xff0c;c和java…

【GEE】4、 Google 地球引擎中的数据导入和导出

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 如何将您自己的数据集引入 GEE。如何将来自遥感数据的值与您自己的数据相关联。如何从 GEE 导出特征。 2背景 了解动物对环境的反应对于了解如何管理这些物种至关重要。虽然动物被迫做出选择以满足其基本需求&am…

机器学习---SVM目标函数求解,SMO算法

1. 线性可分支持向量机 1.1 定义输入数据 假设给定⼀个特征空间上的训练集为&#xff1a; 其中&#xff0c;(x , y )称为样本点。 x 为第i个实例&#xff08;样本&#xff09;。 y 为x 的标记&#xff1a; 当y 1时&#xff0c;x 为正例&#xff1b;当y −1时&#xff0c;x…

✔ ★【备战实习(面经+项目+算法)】 11.5学习

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

【LeetCode力扣】287.寻找重复数

1、题目介绍 原题链接&#xff1a;287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;nums [1,3,4,2,2] 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;nums [3,1,3,4,2] 输出&#xff1a;3提示&#xff1a; 1 < n &l…

由于找不到vcomp140.dll,无法继续执行代码问题的5种修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些奇怪的错误提示&#xff0c;其中最常见的就是“无法找到xxx.dll文件”。而其中一个常见的问题就是“找不到vcomp140.dll无法继续执行代码”这个错误通常会导致某些应用程序无法正常运行。那么&#xff0c;当遇到这个问题时&am…

腾讯云CVM服务器购买流程_省钱入口(一步步操作)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

删除链表的倒数第 N 个结点

LeetCode 19. 删除链表的倒数第 N 个结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *n…

Sublime Text 4 激活教程,内含码(亲测有效) 原创

给大家分享一个 Sublime Text 4 免费注册方法&#xff0c;亲测可用&#xff0c;希望能帮助到大家&#xff0c;上面是我激活成功的截图。 前言 Sublime Text 是一个轻量、简洁、高效、跨平台的编辑器。 Sublime Text具有漂亮的用户界面和强大的功能&#xff0c;例如代码缩略图…

Glide transform CircleCrop()圆图,Kotlin

Glide transform CircleCrop()圆图&#xff0c;Kotlin import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load.resource.bitmap.CircleCropclass MainActivity : AppCompatActivity() {o…

【Mybatis小白从0到90%精讲】15: Mybatis配置打印SQL日志

文章目录 前言配置日志实现前言 日志(Log)是每个程序都不可或缺的一部分,它可以帮助开发人员诊断和调试问题。Mybatis,作为一款备受赞誉的ORM框架,自然也提供了强大的日志功能。 它不仅提供了内置的标准实现,还支持集成各种主流的日志框架,让我们可以轻松地查看最终执行…