本帖最后由 arm_nuedu 于 2017-11-16 14:45 编辑
在新唐m4 nuedu 红外线接收与发送的程序中,关于pwm有一下配置。 问题:1:什么是施密特触发, 我的理解:平时都是高于某一临界值,高便为高,低便是低,施密特等于说设置了两个值。高于一个临界值才是高,低同样这样抗干扰的能力肯定会更高。 只是在trm技术手册上没有看到pwm capture的相关简介,所以厚着脸皮来这里问问 。。。。
2:capture的1000是怎么选的?在nec bit0/1 的规范中如图下面附件,有560us的pwm方波和560的低电平,capture下降沿应该不会收到560us pwm那个影响(因为他是30%占空比,它本身就有下降沿,从程序来看,这个下降沿应该没算),应该跟1000这个设置有关系,但就是想不通 我的理解:1/38000 =2.63*10^-5,就是26us,即使再 *0.3,高电平也是7.8us。 那么capture的1000怎么算出来的呢??? 点进入,该参数的说明是计数的单位。该单位是ns级的,设为1000,也就是1us记一个数。 如果这样,pwm 输出时,NEC协议要求的,560us微妙的pwm,都会引起pwmcapture的捕获,不是吗? 在nec rx函数中是严格控制步骤,应该不会这样: 下面是部分rx程序: voidIrDa_NEC_Rx(uint32_t u32Time) {
if(IR_State == 0) { IR_LDC_Ready = 0; // Clear LeaDer Code Ready IR_CTC_Ready = 0; // Clear CusTomer Code Ready IR_State++; } // Leader or Repeater code else if(IR_State == 1) { // Leader code if((u32Time >= IR_LDC_MIN)&& (u32Time <= IR_LDC_MAX)) { IR_LDC_Ready = 1; // Set LeaDer Code Ready IR_State++; } else { IR_State = 1; IR_LDC_Ready = 0; // Clear LeaDer Code Ready IR_CTC_Ready = 0; // Clear CusTomer Code Ready } } // Customer code 0 else if((IR_State >= 2 &&IR_State < 10) && (IR_LDC_Ready == 1)) { IR_State++; IR_CTC0 = IR_CTC0 >> 1;
这是配置函数: 输出 PWM_ConfigOutputChannel(PWM0,3, 38000, 30);
接收 /* set PWM1 channel 3 capture configuration*/ PWM_ConfigCaptureChannel(PWM0, 5, 1000,0);//1000说是捕获单位,单位是ns,我觉得不对的是,72M对应不是ns. 0没有用
/* Enable capture falling edge interruptfor PWM1 channel 3 */ PWM_EnableCaptureInt(PWM0, 5,PWM_CAPTURE_INT_FALLING_LATCH);
/* Enable PWM1 NVIC interrupt */ NVIC_EnableIRQ(PWM0P2_IRQn);
/* Enable Timer for PWM1 channel 3 */ PWM_Start(PWM0, PWM_CH_5_MASK);
/*Enable Input Schmitt Trigger*/ PD->SMTEN |= GPIO_SMTEN_SMTEN7_Msk;
/* Enable Capture Function for PWM1 channel3 */ PWM_EnableCapture(PWM0, PWM_CH_5_MASK);
/* Enable falling capture reload */ PWM0->CAPCTL |= PWM_CAPCTL_FCRLDEN5_Msk;
|