概述
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库的一些函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复