Проблема с ШИМ из-за Arduino (Cortex-M3)

Я использую ШИМ на плате Arduino, которая использует микроконтроллер SAM3X8E(cortex-m3). Когда я использую PWM для включения и выключения на этой плате, сигнал отключается по аналогии при отключении канала, вместо того, чтобы оставаться на 0 или 1. Пожалуйста, смотрите прилагаемый сигнал. Я пробовал код, напрямую записывая в регистры, но это было то же самое. Я также попробовал резистор 4,7 кОм на выходе ШИМ, но получил те же результаты. Подскажите пожалуйста как это исправить в программном обеспечении.

Если аппаратное решение также возможно с некоторыми внешними компонентами, это тоже нормально. Сфера изображения прилагается. Синяя область видимости предназначена для линии 34 (PC02) и желтая для строки 35 (PC03).

// include all arduino libraries here.. these are only accepted from ino files.
#include <Arduino.h>
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>

void setup() {
  // put your setup code here, to run once:
  pmc_enable_periph_clk (PWM_INTERFACE_ID) ;  // turn on clocking to PWM unit

  PWMC_ConfigureChannel (PWM, 0, 1, 0, PWM_CMR_CPOL) ; // PWM channel 0, clock = MCLK/2 = 42MHz
  PWMC_SetPeriod (PWM, 0, 700) ;  // period = 700 pwm clocks (60kHz)
  PWMC_SetDutyCycle (PWM, 0, 80*700/100) ;  // duty set to 80%
  PWMC_EnableChannel (PWM, 0) ;   // enable

  // Configure pin 34 (PC2) to be driven by peripheral B (PWM channel 0 L)
  // enable pin PC02 and PC03, they are complimentary
  PIOC->PIO_PDR = 0xC ;  // disable PIO control
  PIOC->PIO_IDR = 0xC ;   // disable PIO interrupts
  PIOC->PIO_ABSR |= 0xC ;  // switch to B peripheral

}

void loop() {
  // put your main code here, to run repeatedly:


// From these settings, I got these numbers from the scope - 13.3us on time and 3.32us off time
//

  PWMC_EnableChannel (PWM, 0) ;   // enable
  delayMicroseconds(100);
  PWMC_DisableChannel (PWM, 0) ;   // enable
  delayMicroseconds(100);
}

А вот и сфера изображений:

объем изображения

1 ответ

Требуется некоторое время, чтобы отключить канал. Попробуйте добавить цикл ожидания после отключения:

void loop() {
  PWMC_EnableChannel (PWM, 0) ;   // enable
  delayMicroseconds(100);
  PWMC_DisableChannel (PWM, 0) ;   // disable
  while ((PWM->PWMC_SR & 1) != 0); //add this
  delayMicroseconds(100);
}
Другие вопросы по тегам