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

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;
STM32HAL库输出精确数量PWM波遇到的问题_第1张图片

然后是DMA设置,注意这里一定要把通道设置为内存到外设,数据传输从内存地址到外设地址,字节数要和上面的uint32_t *pData相对应(word)。
STM32HAL库输出精确数量PWM波遇到的问题_第2张图片

基本代码

      //设置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个脉冲,输出结果
STM32HAL库输出精确数量PWM波遇到的问题_第3张图片
发现输出数量是正确的但是并不是按照顺序,最后一个数据跑的前面去了,查阅手册还有别人的CSDN,猜测PWM输出 每次都以DMA最后一个数开始输出,造成这样的原因依然没明白,希望有大佬可以指点。
STM32HAL库输出精确数量PWM波遇到的问题_第4张图片

解决方法

这里把最后一个数据设为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);

  }


产生的脉冲和占空比都正确了
STM32HAL库输出精确数量PWM波遇到的问题_第5张图片

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

参考链接

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

你可能感兴趣的:(STM32,stm32,单片机,arm)