STM32
直播中

李桂兰

7年用户 1371经验值
私信 关注
[问答]

DMA传输控制PWM的输出占空比遇到的疑问求解

问题是这样的:
定义了一个数组,内容为PWM波的占空比对应的脉冲数,本人利用DMA通道将数组传输至tiM1的CCR,TIM1设置为PWM输出,从而改变PWM波的脉冲比,发现传输至TIM1的CCR,TIM1的CH1一直输出高电平,而不是占空比变化的PWM波。而传输至TIM2或TIM3等通用定时器的CH口,PWM波的输出及占空比均正常。
下面是传输至TIM1的代码:
#include "STM32f10x.h"

u16 buf1[20] = {5,14,22,30,37,44,49,53,56,57,57,56,53,49,44,37,30,22,14,5};

void DMA_Configuration(void)
{
  DMA_InitTypeDef D;

  //????????90???
  DMA_DeInit(DMA1_Channel2); //DMA1_3?????
  D.DMA_PeripheralBaseAddr = (u32)0x40000034;      //DMA???? TIM3_CCR1_Address  TIM3-1£º40000434  TIM1-1£º40012C34 TIM1-2£º40012C38
  D.DMA_MemoryBaseAddr = (u32)buf1;                 //DMA????  TIM2-1£º40000034 TIM3-2:40000438
  D.DMA_DIR = DMA_DIR_PeripheralDST;               //DST????????????,SRC??????
  D.DMA_BufferSize = 20;                                   //DMA????
  D.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //??????????
  D.DMA_MemoryInc = DMA_MemoryInc_Enable;          //??????????
  D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //????16bit
  D.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;              //????16bit
  D.DMA_Mode = DMA_Mode_Circular;          //???????
  D.DMA_Priority = DMA_Priority_High; //DMA??????
  D.DMA_M2M = DMA_M2M_Disable;                  //??????????
  DMA_Init(DMA1_Channel2,  D);                  //???DMA1
  DMA_Cmd(DMA1_Channel2, ENABLE);     //DMA1_3??

}

static void GPIO_Config(void)
{                                                         
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE);         //TIM3??
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE);  //PA?PB??
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

  //GPIOA ??: TIM3 channel 1 ? 2 ????
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // ??????
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_0 | GPIO_Pin_7;
  GPIO_Init(GPIOA,  GPIO_InitStructure);
}


int main(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  SystemInit();//???????72MHz
  GPIO_Config(); //????
  DMA_Configuration(); //??DMA

  //?????
  TIM_TimeBaseStructure.TIM_Period = 71;       //?????0???999,??1000?,???????
  TIM_TimeBaseStructure.TIM_Prescaler = 0;            //?????:????,??36MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //????????:???
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //??????
  //TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;

  TIM_TimeBaseInit(TIM2,  TIM_TimeBaseStructure);

  //PWM??1????
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //???PWM??1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        
  TIM_OCInitStructure.TIM_Pulse = buf1[0];           //?????,???????????,??????
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //?????????CCR1_Val?????
  TIM_OC1Init(TIM2,  TIM_OCInitStructure); //????1

  TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE); //TIM3 DMA????,?:TIM3_Update????DMA???DMA1_chanel3
//  TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);    //TIM3 DMA????,?:TIM3_CC1????DMA???DMA1_chanel6
  TIM_Cmd(TIM2, ENABLE); //TIM3??
  //TIM_CtrlPWMOutputs(TIM3, ENABLE); //PWM??

  while (1)
{}
}

回帖(2)

h1654155275.5714

2024-4-25 14:56:18
示波器上检测下捕获脉冲宽度
举报

王浩

2024-4-25 17:29:56
从您提供的信息来看,您在使用STM32F10x系列微控制器,通过DMA通道将一个数组传输到TIM1的CCR寄存器,以实现PWM波的占空比变化。但是,您发现TIM1的CH1一直输出高电平,而不是预期的占空比变化的PWM波。而传输至TIM2或TIM3等通用定时器的CH口,PWM波的输出及占空比均正常。

这个问题可能是由于以下几个原因导致的:

1. TIM1的时钟配置问题:请确保您正确配置了TIM1的时钟源和时钟频率。如果时钟配置不正确,可能导致PWM波形不正确。

2. TIM1的模式配置问题:请检查您是否正确设置了TIM1的工作模式。例如,您需要确保TIM1处于PWM模式1或模式2。

3. TIM1的通道配置问题:请确保您正确配置了TIM1的通道(CH1),包括极性、输出比较模式等。

4. DMA传输配置问题:请检查您的DMA传输配置,确保DMA通道正确地将数组中的值传输到TIM1的CCR寄存器。

5. 代码问题:您提供的代码片段不完整,无法判断是否存在其他问题。请检查您的完整代码,确保所有相关的初始化和配置函数都已正确执行。

为了解决这个问题,您可以尝试以下步骤:

1. 检查TIM1的时钟配置,确保时钟源和时钟频率正确。

2. 检查TIM1的工作模式,确保它处于PWM模式1或模式2。

3. 检查TIM1的通道配置,包括极性、输出比较模式等。

4. 检查DMA传输配置,确保DMA通道正确地将数组中的值传输到TIM1的CCR寄存器。

5. 检查您的完整代码,确保所有相关的初始化和配置函数都已正确执行。

6. 如果问题仍然存在,尝试使用另一个DMA通道或另一个TIMx通道进行测试,以排除硬件故障的可能性。

希望这些建议能帮助您解决问题。如果您需要更详细的帮助,请提供完整的代码和配置信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分