这样做为什么会导致占空比改变?

2019-07-15 08:43发布

    今天在使用STM32F4板子定时器产生一个固定占空比的方波时发现一个问题,问题是我调整定时器产生周期分别为2K,8k,16k的方波,在定时器中断里面我加了一个延时1us的函数,用来拉低1us,想通过这样产生一个高占空比的方波。但是调试发现占空比并不会按照我想的那样输出一个高占空比的方波,而是随着频率的增加占空比会逐渐降低 。(程序里用到了几个中断,他的优先级比较高,有操作系统)这会是什么原因产生的呢?希望论坛看到的人来讨论讨论。与此相关代码如下:
//用于产生一个方波
void tiM7_IRQHandler(void)  
{
static char flag = 1;
if(TIM_GetITStatus(TIM7, TIM_IT_Update) == SET)
{
  if(flag == 1)
  {
   AD_ST_PORT->BSRRL = PIN_A8;
   flag = 0;
  }
  else
  {
   AD_ST_PORT->BSRRH = PIN_A8;  //L
   delay_ns(1000);      //定时器里面做这种延时是不是有问题
   AD_ST_PORT->BSRRL = PIN_A8;  //H
  }
  
  TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
}
}

void initTim7()   //定时器的配置  
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* TIM7 clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

/*
  *TIMxCLK(TIM2~7) = APB1(42MHz)*2 = 84MHz
  */

TIM_TimeBaseStructure.TIM_Period = 62;            //16K  占空比为53% 示波器测量的
//TIM_TimeBaseStructure.TIM_Period = 124;       //8K   占空比为76%
//TIM_TimeBaseStructure.TIM_Period = 496;       //2K   占空比为94%
TIM_TimeBaseStructure.TIM_Prescaler = 84;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);

/* Update interrupt enable */

TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);     
TIM_Cmd(TIM7, ENABLE);
}
//延时void delay_ns(uint16_t time)
{
while(time--);
}
0条回答

一周热门 更多>