Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PWM в AT91SAM7S меняется полярность
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
overloaded
Рэндомным образом меняется полярность ШИМа при смене частоты(смена при заходе в условие "if( ((pwm[chn_num] & 0xFFFF0000)>>16)!= PWM_period[chn_num] )//смена периода ШИМ"). Причем если становится отладчиком на брейкпоинт "<- ТУТ БРЕЙКПОИНТ " (см. код) то вроде и не меняется.. Или просто так попадало.. Кстати после первого ENABLE полярность всегда правильная. Проверяю на одном канале. У меня варианты закончились.. Заранее спасибо всем откликнувшимся =)
Код
  unsigned int val;
  unsigned int per_update;  
  
  //ch0
  if( ((pwm[chn_num] & 0xFFFF0000)>>16)!= PWM_period[chn_num] )//смена периода ШИМ
  {    
    PWM_period[chn_num] = ((pwm[chn_num] & 0xFFFF0000)>>16);  
    
    *AT91C_PWMC_DIS = (1<<chn_num);//disable chn
    
    if(PWM_period[chn_num]==0)      
      return;
    
    per_update = PWM_period[chn_num] * 50;// Hz
    
    if(per_update <= 2500)
    {
        per_update = 48000000 / 16 / per_update;
        *AT91C_PWMC_CH0_CMR = 0x04;//MCK/16
    }
    else
    {
        per_update = 48000000 / per_update;
        *AT91C_PWMC_CH0_CMR = 0;//MCK/1
    }
    
    if(per_update > 1)//errata
    {
      *AT91C_PWMC_CH0_CMR|= (1<<9);//CPOL = 1
      *AT91C_PWMC_CH0_CPRDR = per_update;
      *AT91C_PWMC_CH0_CDTYR = 2;          

      *AT91C_PWMC_ENA = (1<<chn_num);//enable chn         <- ТУТ БРЕЙКПОИНТ  !!!!
    }
  }
  else
    if(*AT91C_PWMC_SR & (1<<chn_num))    
    {  
          val = pwm[chn_num] & 0xFFFF;        
                  
          if(val < 2)//errata
            val = 2;

        while(*AT91C_PWMC_CH0_CCNTR < 2);//errata
        *AT91C_PWMC_CH0_CUPDR = val;
    }
overloaded
Неужели никто в процессе работы ШИМ не меняет его частоту? (а только скважность)?? Ок.. Вопрос поставленный по другому - т.к. после включения ШИМ полярность всегда правильная, есть ли способ сделать ему что-то типа софтвер резета? Как видно из кода, просто ДИЗЕЙБЛ канала не помогает.. Хотя это уже как-то не совсем как хотелось бы..
overloaded
вроде работает
Помогло while(*AT91C_PWMC_SR & (1<<chn_num)); после disable chn_num а также задержка в 2 PWM клока после изменения регистров и перед enable канала. Насчет задержки не уверен что нужна, но оставил на всякий случай ))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.