Проблема с ШИМ из-за 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);
}