arduino的PWM问题到期(cortex-m3)

arduino的PWM问题到期(cortex-m3),arduino,arm,cortex-m3,Arduino,Arm,Cortex M3,我在使用SAM3X8E(cortex-m3)微控制器的arduino due板上使用PWM。当我在这个板上使用PWM enable和disable时,波形在禁用通道时变为模拟波形,而不是保持在0或1。请参阅所附的波形。我也通过直接写入寄存器来尝试代码,但结果是一样的。我还尝试在pwm输出端使用4.7k下拉电阻器,但得到了相同的结果。请告诉我如何在软件中修复它 如果硬件解决方案也可以使用一些外部组件,也可以。范围图像已附加。蓝色示波器输出用于第34行(PC02),黄色示波器输出用于第35行(PC0

我在使用SAM3X8E(cortex-m3)微控制器的arduino due板上使用PWM。当我在这个板上使用PWM enable和disable时,波形在禁用通道时变为模拟波形,而不是保持在0或1。请参阅所附的波形。我也通过直接写入寄存器来尝试代码,但结果是一样的。我还尝试在pwm输出端使用4.7k下拉电阻器,但得到了相同的结果。请告诉我如何在软件中修复它

如果硬件解决方案也可以使用一些外部组件,也可以。范围图像已附加。蓝色示波器输出用于第34行(PC02),黄色示波器输出用于第35行(PC03)

//此处包含所有arduino库。。这些仅从ino文件接受。
#包括
#包括
#包括
#包括
无效设置(){
//将安装代码放在此处,以便运行一次:
pmc_enable_periph_clk(PWM_INTERFACE_ID);//打开对PWM单元的时钟
PWMC_配置通道(PWM,0,1,0,PWM_CMR_CPOL);//PWM通道0,时钟=MCLK/2=42MHz
PWMC_设置周期(PWM,0700);//周期=700个PWM时钟(60kHz)
PWMC_SetDutyCycle(脉宽调制,0,80*700/100);//占空比设置为80%
PWMC_启用通道(PWM,0);//启用
//配置由外围设备B(PWM通道0 L)驱动的针脚34(PC2)
//启用pin PC02和PC03,它们是免费的
PIOC->PIO_PDR=0xC;//禁用PIO控制
PIOC->PIO_IDR=0xC;//禁用PIO中断
PIOC->PIO_ABSR |=0xC;//切换到B外设
}
void循环(){
//将主代码放在此处,以便重复运行:
//从这些设置中,我从范围中获得了这些数字-13.3us准时和3.32us非准时
//
PWMC_启用通道(PWM,0);//启用
延迟微秒(100);
PWMC_禁用通道(PWM,0);//启用
延迟微秒(100);
}
Ans以下是范围图像:


禁用频道需要一些时间。 尝试在禁用后添加等待循环:

void loop() {
  PWMC_EnableChannel (PWM, 0) ;   // enable
  delayMicroseconds(100);
  PWMC_DisableChannel (PWM, 0) ;   // disable
  while ((PWM->PWMC_SR & 1) != 0); //add this
  delayMicroseconds(100);
}

您确定示波器上的CH1和CH2都处于直流耦合状态吗?是的,两个通道都处于直流耦合状态。为什么不将PWM占空比设置为最大值或最小值,而不是禁用?正如您所说,我尝试检查状态寄存器,得到的波形相同。延迟是多余的。它工作得很好,甚至没有任何延迟。根据文件,pwm禁用完成后,应完成该循环并停止。这就是这里正在发生的事情,但当它结束时,产出不是像石头一样下降,而是开始下降。需要很好的毫秒,输出才会接近0v。
void loop() {
  PWMC_EnableChannel (PWM, 0) ;   // enable
  delayMicroseconds(100);
  PWMC_DisableChannel (PWM, 0) ;   // disable
  while ((PWM->PWMC_SR & 1) != 0); //add this
  delayMicroseconds(100);
}