我是靠谱客的博主 还单身钥匙,最近开发中收集的这篇文章主要介绍STM32HAL库输出精确数量PWM波遇到的问题用到的HAL库的一些函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

STM32HAL库输出精确数量PWM波遇到的问题

  • 用到的HAL库的一些函数
    • CUBEMX的配置
    • 基本代码
    • 解决方法
    • 参考链接

用到的HAL库的一些函数

/* Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
/* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

前两个函数分别为阻塞模式和中断模式,这里不多说。主要是第三种模式,使用DMA模式输出占空比和数量可调节的PWM波
TIM_HandleTypeDef *htim----为定时器的句柄
uint32_t Channel ----产生PWM的通道
uint32_t *pData----32位的数据(需要和DMA中字节数相对应),用于控制占空比,占空比需要根据时钟的频率来设置,本次时钟为1000(500表示占空比为50%)
uint16_t Length----表示产生的脉冲数量

CUBEMX的配置

首先是时钟配置,根据主频72M,算出1000HZ,初始PWM值为0;
在这里插入图片描述

然后是DMA设置,注意这里一定要把通道设置为内存到外设,数据传输从内存地址到外设地址,字节数要和上面的uint32_t *pData相对应(word)。
在这里插入图片描述

基本代码

      //设置10个通道的占空比
		 for(i=0;i<10;i++)
	{
		send[i]=40*(i+1);
//		send[i]=800;
		printf("%d ",send[i]); //40 80 120 160 200 240 280 320 360 400
	
	}
	
  while (1)
  {

//		 HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_3,(uint32_t*)send,10);
		
			if(flag==1)    //控制推进
		{
			
			HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_3,(uint32_t *)send,10);
			
			flag=0;

		}

		HAL_Delay(100);
  }

这里使用HAL_TIM_PWM_Start_DMA输出了10个脉冲,输出结果
在这里插入图片描述
发现输出数量是正确的但是并不是按照顺序,最后一个数据跑的前面去了,查阅手册还有别人的CSDN,猜测PWM输出 每次都以DMA最后一个数开始输出,造成这样的原因依然没明白,希望有大佬可以指点。
在这里插入图片描述

解决方法

这里把最后一个数据设为0,比如要发10个脉冲然后发送11个,同时最后一个占空比设为0.只能想到这个笨办法了

	for(i=0;i<10;i++)
	{
		send[i]=40*(i+1);
//		send[i]=800;
		printf("%d ",send[i]);
	
	}
	
	 send[10]=0;

  while (1)
  {
//		 HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_3,(uint32_t*)send,10);
		
			if(flag==1)    //控制推进
		{
			
			HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_3,(uint32_t *)send,11);
			
			flag=0;

		}

		HAL_Delay(100);

  }


产生的脉冲和占空比都正确了
在这里插入图片描述

希望有大佬能分析一下原因

参考链接

https://blog.csdn.net/qq_30267617/article/details/109466698

最后

以上就是还单身钥匙为你收集整理的STM32HAL库输出精确数量PWM波遇到的问题用到的HAL库的一些函数的全部内容,希望文章能够帮你解决STM32HAL库输出精确数量PWM波遇到的问题用到的HAL库的一些函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部