在进行PWM输出时,碰到的一个问题(关于PWM暂停现象的)

一、问题描述

定时器的配置:

void MX_TIM14_Init(void)
{TIM_OC_InitTypeDef sConfigOC;htim14.Instance = TIM14;htim14.Init.Prescaler = 15-1;htim14.Init.CounterMode = TIM_COUNTERMODE_UP;htim14.Init.Period = 64000-1;htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim14) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}if (HAL_TIM_OC_Init(&htim14) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sConfigOC.OCMode = TIM_OCMODE_TOGGLE;sConfigOC.Pulse = 0;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_OC_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}HAL_TIM_MspPostInit(&htim14);}

当我按键按下的时候,写flash,这个时候PWM输出的波形为20ms低电平,20ms高电平;然后我想让在写flash的时候,PWM输出的一直为低,百度也找了下,说是控制占空比,但是我试了下,效果不是很好,

[图1是不控制比较值,下面是写flash时候的代码]

//      __HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 64000);__disable_irq();Write_Flash_Buf(FLASH_RF_PIN_MODE_ADR,(uint8_t *) modebuff, sizeof(modebuff));Write_Flash_Buf(FLASH_RF_PIN_DATA_ADR, Slave_re_Pindata_temp, sizeof(Slave_re_Pindata_temp));__enable_irq();

当我将上面屏蔽的 // __HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 64000); 打开时, 采集到的现象是图2

在图2中的1,这个时候写flash前是低电平的, __HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, 64000); 设置这个比较值,然后在写flash的时候电平一直是低电平的;
但是图2中的2,flash前正好是高电平,设置这个比较值,然后在写flash的时候电平一直是高电平的;

我想达到的目的就是在写flash前,将其电平一直为低
【图1】

【图2】

二、处理方法

我目前的做法
主要是等待到他电平为低,在让他保持当前值

方法一:由于我在写flash的时候,将中断关闭了,而修改定时器比较值又是在定时器中断执行的,所以我关闭中断前,要将PWM输出低电平
主要修改了两个地方
1.定时器中断中,当我按键产生的标志,那么会执行下面这些,当高电平进入中断,则保持他之前输出的高电平时间,低电平的话,就让他保持当前状态

if(HAL_GPIO_ReadPin(timch->GPIOx, timch->GPIO_Pin) == GPIO_PIN_SET)//读取该定时器对应引脚电平  高电平{timch->count =__HAL_TIM_GET_COMPARE(&timch->htim, timch->channel) + (4864+Buf[rps[timch->rpspin].mode]-2048);timch->count = (timch->count>TIM_PERIOD) ? (timch->count-TIM_PERIOD) : (timch->count);//比较值大于重装载值 减去重装载值__HAL_TIM_SET_COMPARE(&timch->htim, timch->channel, timch->count);        //设置比较值}else  //低电平{__HAL_TIM_SET_COMPARE(&timch->htim, timch->channel,64000);        //保持当前电平}

2.在写flash前,等待电平为低,再输出64000(100%)保持当前电平

while(HAL_GPIO_ReadPin(TIMCH_Buff[i].GPIOx, TIMCH_Buff[i].GPIO_Pin) != GPIO_PIN_RESET){}
__HAL_TIM_SET_COMPARE(&TIMCH_Buff[i].htim, TIMCH_Buff[i].channel, 64000);__disable_irq();Write_Flash_Buf(FLASH_RF_PIN_MODE_ADR,(uint8_t *) modebuff, sizeof(modebuff));Write_Flash_Buf(FLASH_RF_PIN_DATA_ADR, Slave_re_Pindata_temp, sizeof(Slave_re_Pindata_temp));__enable_irq();

方法二:当写flash前后没有对中断进行开关
那么可以直接在写flash前等待他为低电平,然后对定时器输出进行关闭,写完之后再开启

while(HAL_GPIO_ReadPin(TIMCH_Buff[i].GPIOx, TIMCH_Buff[i].GPIO_Pin) != GPIO_PIN_RESET){}
HAL_TIM_OC_Stop_IT(&TIMCH_Buff[i].htim, TIMCH_Buff[i].channel);Write_Flash_Buf(FLASH_RF_PIN_MODE_ADR,(uint8_t *) modebuff, sizeof(modebuff));
Write_Flash_Buf(FLASH_RF_PIN_DATA_ADR, Slave_re_Pindata_temp, sizeof(Slave_re_Pindata_temp));HAL_TIM_OC_Start_IT(&TIMCH_Buff[i].htim, TIMCH_Buff[i].channel);

此次记录,主要是因为PWM输出到舵机时,当我按键按下后,在进行写flash的时候,舵机出现抖动,通过逻辑分析仪采集到PWM输出波形会出现20ms高电平,20ms低电平(因为关闭中断了,而修改比较值是在定时器中断中),现在通过上述方法,在写flash时,舵机不会出现抖动,逻辑分析仪采集的现象在写flash的时候,PWM波形是低电平。

文章如有问题,欢迎大家进行指正!

笔记之PWM暂停输出,保持低电平问题相关推荐

  1. STM8学习笔记---利用PWM功能输出SPWM波

    要生成SPWM波,其关键是要生成一组正弦规律变化的数字,然后将数字对应成PWM输出的占空比,按照顺序输出占空比就行.生成正弦波的方法在 使用C语言产生正弦波数据 这篇博客有详细说明,这里就不说了. 本 ...

  2. 【STC15】3路PWM波形输出示例演示

    [STC15]3路PWM波形输出示例演示 本示例采用的是STC官方所给的<STC15系列库函数与例程测试版V2.0>里面的示例程序,测试的芯片型号:STC15W408AS.自制的开发板,采 ...

  3. STM32 重新理解GPIO配置以及配置PWM波输出

    最近做了个SD卡BOOTLOARDER程序.在测试过程中,想到可以利用板子的LED灯进行萤火虫灯的制作,通过BOOTLOARDER将APP文件下载到板子里面查看LED灯的闪烁.可能是因为太过自信,这么 ...

  4. STM32笔记之PWM输出,调节频率及占空比

    以STM32F103C8T6使用TIM1的CH1,CH4同时输出两路PWM为例: 引脚 定时器 通道 PA8 TIM1 CH1 PA11 TIM1 CH4 步骤: GPIO_InitTypeDef G ...

  5. STM32学习笔记:通用定时器输出PWM

    脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度.电机转速等. STM32 的定时 ...

  6. c语言使单片机输出低电平,单片机开发中的一些实用技巧

    很多朋友正在学习单片机开发技术,但开发中免不了要碰到这样.那样的问题,有些问题可能无碍大局,但有一些问题却直接影响到产品的成本.体积.性能.这里介绍笔者的几个技巧,希望对大家的工作有帮助. 一.C语言 ...

  7. ttl接地是高电平还是低电平_(音源很重要)18新汉兰达音响改装升级原车主机改低电平RCA输出...

    18款新汉兰达,原车主机高电平输出(失真最高达10%以上)直推喇叭,前四后二!高转低的效果有目共睹,现在已经是极少车友选择使用!高电平进DSP是目前比较多车友选择的,可能是无奈之举,其实它还是充当高转 ...

  8. 启明智显分享| ESP32学习笔记参考--PWM(脉冲宽度调制) 篇,配PWM控制 LED呼吸灯代码示例参考

    提示:启明智显专为智能产品提供一站式彩屏显示+连接+云端服务+APP软件开发.维护等解决方案,帮厂商快速实现硬件的智能化.作为启明云端旗下方案公司,我们用心整理了开发小伙伴在开发过程中可能会遇到的问题 ...

  9. 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出

    什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...

  10. stm32 PWM互补输出

    stm32高级定时器例子-stm32 PWM互补输出 定时器初始化结构体 TIM_TimeBaseInitTypeDef 时基结构体,用于定时器基础参数设置,与TIM_TimeBaseInit函数配合 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:目标检测
  2. 指纹锁就安全了?防火防盗还得防AI
  3. 微信公众号点击菜单即可打开并登录微站的实现方法
  4. 【必看】如何在 Linux 上恢复误删除的文件或目录
  5. 通过 OLE 上传资料
  6. 白盒测试之初识gtest工具
  7. vue 侦听器侦听对象属性_Spring中的异步和事务性事件侦听器
  8. VC++绘图时,利用双缓冲解决屏幕闪烁 转载
  9. java之try catch finally
  10. 二值化区分前景和背景
  11. RPM 打包技术与典型 SPEC 文件分析
  12. 蚁群算法原理及Matlab实现
  13. 通过CocoCut插件和m3u8下载器下载网页视频并转换成mp4格式
  14. opencv2 Mat类copyTo()函数的内存泄露问题
  15. 图片剪切遇到的bug
  16. LM224的放大电路的几个应用电路
  17. 转发:五个方向告诉你如何运营好一个公众号!
  18. php二级分销kohana源码,php框架kohana(二)
  19. 计算机打字无限长页面,Win10电脑键盘自动无限输入怎么办
  20. 大数据分析深度学习在自然语言处理NLP中的应用

热门文章

  1. 初中数学知识点总结_初中数学知识点总结大全 这下全了!
  2. 关于PostgreSQL的绑定变量窥视的问题详解
  3. 计算机毕业设计Java-ssm办公自动化管理系统源码+系统+数据库+lw文档
  4. 浅析deep深度选择器
  5. 计算机中专生未来三年的规划,职业中专三年发展规划.doc
  6. 计算机应届生必看--Java基础笔试面试题(一)
  7. 90岁的褚时健退休了,我们能够从褚老身上学到些什么?
  8. 多文件自平衡云传输(二)资源接收 断点续传篇 —————— 开开开山怪
  9. cout 常用成员函数简介(C++输出格式控制)
  10. 苹果MAC AIR MACOS X 10.8安装notes提示OS版本过低