This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PWM初始化后如何一直保持低电平

Other Parts Discussed in Thread: CC2541

芯片:CC2541

问题:

我使用的是定时器1来产生PWM,io口设置为位置2,CH0配置为0xC(即清除比较输出,比较模式),比较值为20000-1

CH1配置为0x24(即:清除比较输出,上下模式下设置on比较down。否则清除比较时的输出,设置为0;比较模式)

CH1初始比较值为0.用的是模模式

(当后面对CH1比较值修改大于0时,CH0会配置为0x0)

为什么PWM初始化完后,io口输出的是高电平,而不是低电平?(想初始化完io一直保持低电平,直到CH1比较值改变)

  • 将代码传上来看看
  • void pwmPulse(uint16 value_CH1,uint16 value_CH2)
    {
    T1CC1L = (uint8)(value_CH1 );
    T1CC1H = (uint8)(value_CH1 >> 8);
    T1CC2L = (uint8)(value_CH2 );
    T1CC2H = (uint8)(value_CH2 >> 8);
    }


    void PWM_init(void)
    {
    //CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振

    //while(CLKCONSTA & 0x40); //等待晶振稳定为32M
    CLKCONCMD |= 0x28; //设置定时器输出为1MHz
    P2SEL &= ~(1<<4); //定时器1优先

    //设置pwm端口为输出
    P1DIR|= BV(0)|BV(1); //CH_2 and CH_1
    P0DIR|= BV(6)|BV(7); //CH_3 and CH_4
    //设置pwm端口为外设端口,非gpio
    P1SEL|= BV(0)|BV(1);
    P0SEL|= BV(6)|BV(7);
    //由于uart等会占用我们当前使用的pwm端口,因此需要将uart等重映射到别的端口去。
    PERCFG |= 0x44; // Move USART1&2 to alternate2 location so that T1 is visible
    // Initialize Timer 1
    T1CTL = 0x2;//0xE; // Div = 1, CLR, MODE = Suspended
    T1CCTL1 = 0x24;
    T1CCTL2 = 0x24;

    T1CCTL0 = 0xC;//0x0; //设置低电平
    T1CC0L = (uint8)(PWM_PERIOD );
    T1CC0H = (uint8)(PWM_PERIOD >> 8);
    EA=1;
    IEN1 |= 0x02; // Enable T1 cpu interrupt

    pwmPulse(0,0);
    T1CNTL = 0; // Reset timer to 0;
    }
  • PWM初始化输出设定就是高电平,可以先将占空比设为0或者先将IO设为低电平再初始化PWM
  • 这两种方法我试了,也不行,都还是高电平。
    刚才我尝试了下端口设为输入和将端口设为通用io,可以形成低电平
    不知道这种方法可不可以使用?
  • 你可以设为通用IO试试