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

用到的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值