按键控制输出占空比可调的PWM波
这里写自定义目录标题
- 按键的误区
- 举个例子
- 代码如下
- 实验结果
- 如何插入一段漂亮的代码片
- 生成一个适合你的列表
- 创建一个表格
- 设定内容居中、居左、居右
- SmartyPants
- 创建一个自定义列表
- 如何创建一个注脚
- 注释也是必不可少的
- KaTeX数学公式
- 新的甘特图功能,丰富你的文章
- UML 图表
- FLowchart流程图
- 导出与导入
- 导出
- 导入
按键的误区
按键有很多种,按下到放开,一直按。。。。。。一般大家都喜欢用delay()这个延时程序,但有时会碰到很多问题,delay()是不精准延时,按键按下的时候存在抖动,不可能说每次都能很准确地消抖。所以说有时候写的代码达不到预期的效果。
举个例子
在做按键控制输出占空比可调的PWM波时,因为存在delay(),输出波形要等delay()之后才输出。delay()一次的时间可能你设置了20ms,但是你不知道按键按下到弹起之间上升沿和下降沿切换了多少次,不知道有没有完全消抖。所以在按键切换波形的时候会发生误按:按一下可能刚好是一下,也可能是2下,3下,是一个随机数了。为了解决这个问题,我们只需要将按键的高/低电平一直持续到我们放开按键的时刻就可以解决了。
代码如下
main.c
#include “stm32f10x.h”
#include “bsp_advancetime.h”
#include “bsp_key.h”
#include “bsp_led.h”
uint16_t Value;
int main(void)
{
Value=5; //设置初始脉宽为5
LED_GPIO_Config(); //LED初始化
Key_GPIO_Config(); //按键初始化
Advance_Time_Config(); //输出初始化波形,脉宽为5
while(1)
{if(Key_Scan(GPIOA,GPIO_Pin_0)==KEY_ON) //如果按键按下{Value=Value-1; if(Value==0) //如果脉宽=0的时候切换回5{Value=5;}Advance_Time_Config(); //输出波形LED1_TOGGLE; //LED1状态翻转}
}
}
bsp_advancetime.c
#include “bsp_advancetime.h”
#include “bsp_key.h”
extern uint16_t Value;
void Advance_Time_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*输出比较通道初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; /*复用推挽输出*/
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);/*输出比较通道互补通道初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);/*输出比较通道刹车通道初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);/*BKIN引脚默认输出低电平 为1时表示刹车*/
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
void Advance_Time_Mode_Config(void)
{
/开启TIM1时钟/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
/时基结构体初始化配置/
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/ARR的值 时钟周期/
TIM_TimeBaseInitStruct.TIM_Period=7;
/72M时钟的预分频数 提供给计数器计数/
TIM_TimeBaseInitStruct.TIM_Prescaler=8;
/不启动重复计数/
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
/配置死区时间用/
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
/计数器为向上计数模式/
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
/时基结构体初始化/
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
/*输出比较结构体初始化*/
TIM_OCInitTypeDef TIM_OCInitStruct;
/*输出模式配置为PWM1*/
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
/*输出使能*/
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
/*互补输出使能*/
TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
/*Pulse/Period+1*/
TIM_OCInitStruct.TIM_Pulse=Value; /*Pulse实际改变的是CCR的值 当CNT计数到CCR时,电平发生一次翻转*/
/*输出通道为高电平有效*/
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
/*空闲状态时,经过死区时间后为低电平*/
TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Reset;
/*输出比较结构体初始化*/
TIM_OC1Init(TIM1, &TIM_OCInitStruct);
/*使能预装载CCR1*/
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
/*使能计数器*/
TIM_Cmd(TIM1,ENABLE);
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
void Advance_Time_Config(void)
{
Advance_Time_GPIO_Config();
Advance_Time_Mode_Config();
}
bsp_advancetime.h
#ifndef _BSP_ADVANCETIME_H
#define _BSP_ADVANCETIME_H
#include “stm32f10x.h”
void Advance_Time_GPIO_Config(void);
void Advance_Time_Mode_Config(void);
void Advance_Time_Config(void);
#endif /_BSP_ADVANCETIME_H/
bsp_key.c
#include “bsp_key.h”
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{
/*等待按键释放 */
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
bsp_key.h
#ifndef _BSP_KEY_H
#define _BSP_KEY_H
#include “stm32f10x.h”
#define KEY_ON 1
#define KEY_OFF 0
void Key_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);
#endif /_BSP_KEY_H/
bsp_led.c
#include “bsp_led.h”
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
GPIO_SetBits(GPIOC,GPIO_Pin_3);
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
bsp_led.h
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include “stm32f10x.h”
/* 定义控制IO的宏 */
#define LED1_TOGGLE digitalToggle(GPIOC,GPIO_Pin_2)
#define LED1_OFF digitalHi(GPIOC,GPIO_Pin_2)
#define LED1_ON digitalLo(GPIOC,GPIO_Pin_2)
#define LED2_TOGGLE digitalToggle(GPIOC,GPIO_Pin_3)
#define LED2_OFF digitalHi(GPIOC,GPIO_Pin_3)
#define LED2_ON digitalLo(GPIOC,GPIO_Pin_3)
/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
#define digitalLo(p,i) {p->BRR=i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
void LED_GPIO_Config(void);
#endif /_BSP_LED_H/
实验结果
链接: link.
图片:
依次类推
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks |
'Isn't this fun?'
|
‘Isn’t this fun?’ |
Quotes |
"Isn't this fun?"
|
“Isn’t this fun?” |
Dashes |
-- is en-dash, --- is em-dash
|
– is en-dash, — is em-dash |
创建一个自定义列表
- Markdown
- Text-to-HTML conversion tool
- Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ(z)=∫0∞tz−1e−tdt .\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎
按键控制输出占空比可调的PWM波相关推荐
- 如何使用定时器产生两路频率可调、占空比可调的PWM波
接上次的博客,上一篇博客介绍的是产生两路频率可调.占空比固定为50%的方波,但是更多情况下也需要调节占空比,这篇博客简单介绍下.其实和频率可调的输出基本上是一样的,只需要再加上一个Duty来控制CCR ...
- 产生频率或者占空比可调的PWM波【汇编语言】
PWM在各个编程中都非常的重要,在学习32单片机,FPGA等中都有学习到,本次文章为介绍汇编语言编写频率或占空比可调的PWM波,从更加底层的方面介绍和去了解pwm波生成的过程,基于S3C2410X/S ...
- 比较器应用三:占空比可调的PWM波
本文章产生占空比可调的PWM波主要原理是直流波和三角波通过比较器比较,从而比较器输出端输出PWM波,通过图1来说明. 假设三角波接入比较器的负输入端,直流波接入比较器的正输入端,即当直流波大于三角波时 ...
- 占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题
//------------------------------------------------------------------------------------ //程序功能简介:本程序产 ...
- 如何使用定时器产生两路频率可调的PWM波
输出频率可调的方波(占空比不可调,默认为50%) 使用定时器来产生PWM波大家应该都很熟悉,但是如何使用定时器产生频率可调的PWM波呢?这就需要使用定时器的输出比较翻转模式TIM_OCMode_Tog ...
- AVRmega16通过一个定时器实现多路IO口输出多路可调的PWM
本人在做舞蹈机器人时,想到了通过一个定时器实现多路IO口输出多路可调的PWM,用于控制舞蹈机器人各部分的舵机.这个方法比较简洁而且实现自己的要求,且易于理解. /*角度值:15度500us ...
- 51单片机按键控制输出pwm的占空比
之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想要改变占空比,还得回过头来修改程序并重新烧写进单片机.这样做的话不但麻烦.效率低,还又把芯片的可烧写次数减少了一次,虽然51的芯 ...
- 【专题5: 硬件设计】 之 【61.案例四:简易空气净化器,使用硬件产生PWM波并对马达调速】
嵌入式工程师成长之路 系列文章 总目录 系列文章总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新,欢迎微信扫码关注公众号 承接 ...
- 如何使用定时器捕获一路PWM波信号的频率和占空比
本次实验将采用定时器2的通道2产生两路频率和占空比均可调的PWM信号,然后使用定时器3的通道1来捕获其中的一路PWM波的频率和占空比. 1.首先来看下产生PWM波的程序,也就是和上篇博客是一样的,只不 ...
最新文章
- js 读取flask后台变量
- 如果是能简单解决的问题,就不用想得太复杂了
- 听说你想去大厂看学妹,带你看看作业帮产品经理岗面经
- Python开发培训前景如何?
- 避免在循环体中声明创建对象
- React基础学习(第二天)
- js整体缩小网页_妙用JavaScript实现网页的任意缩放
- obs多推流地址_苹果手机IOS系统:抖音+易推流直播手机游戏——墨涩网
- 计算机网络之数据链路层:19、总结
- ubuntu 卸载opencv
- Alter index coalesce VS shrink space
- asp.net oracle odbc,ADO.NET 连接数据库字符串小结(Oracle、SqlServer、Access、ODBC)
- gooflow学习笔记
- 用cmd命令行在windows系统中进行分区操作
- matlab如何用二分法求函数零点,用二分法求函数零点的步骤.PPT
- html多人同时编辑,怎样多人协同在线编辑文档?
- 沙雕动画资源素材大全/小白零基础快速入门沙雕动画/三天快速上手开始制作沙雕动画/
- Netty实战:设计一个IM框架就这么简单!
- Ubuntu下切换root用户认证失败解决方案
- 854计算机专业基础,东华大学2019年考研854计算机及软件工程专业基础综合考试大纲...
热门文章
- iOS 音频播放,录音,视频播放,拍照,视频录制
- 未来的电子计算机作文300字,未来的校园科幻作文300字(精选3篇)
- ​最新淘宝商品详情接口API(稳定低成本)
- 手动挡停车技巧;换挡注意
- web客户端页面连接MQTT服务
- HTML+CSS+JS做一个好看的个人网页—web网页设计作业
- 最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)
- Windows10反复出现“无法完成更新,正在撤销更新”
- 【阿贝云】免费的云服务器,真香
- 【html】svg标签