Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在TM4C123微控制器的PB4上初始化PWM_C_Keil_Pwm - Fatal编程技术网

尝试在TM4C123微控制器的PB4上初始化PWM

尝试在TM4C123微控制器的PB4上初始化PWM,c,keil,pwm,C,Keil,Pwm,正如标题所述,我正在尝试使用Keil作为IDE在TM4C123微控制器上初始化PB4的PWM。到目前为止,我已经能够初始化PB6和PB7,但我不确定PB4为什么不能工作。你们知道我做错了什么吗?提前感谢你的帮助。我已经发布了初始化端口B6的工作代码和不适用于端口B4的代码 // PWM clock rate = processor clock rate/SYSCTL_RCC_PWMDIV // = BusClock/16 // = 80

正如标题所述,我正在尝试使用Keil作为IDE在TM4C123微控制器上初始化PB4的PWM。到目前为止,我已经能够初始化PB6和PB7,但我不确定PB4为什么不能工作。你们知道我做错了什么吗?提前感谢你的帮助。我已经发布了初始化端口B6的工作代码和不适用于端口B4的代码

// PWM clock rate = processor clock rate/SYSCTL_RCC_PWMDIV
//                = BusClock/16
//                = 80 MHz/16 = 5 MHz 
// Output on PB7/M0PWM1
void PWM0B4_Init(uint16_t period, uint16_t duty) 
{
    
    volatile unsigned long delay;
    SYSCTL_RCGCPWM_R |= 0x01;             // 1) activate PWM0
    SYSCTL_RCGCGPIO_R |= 0x02;            // 2) activate port B
    // delay = SYSCTL_RCGCGPIO_R;         // allow time to finish activating
    while((SYSCTL_PRGPIO_R&0x02) == 0){};
    GPIO_PORTB_AFSEL_R |= 0x10;           // enable alt funct on PB4
    GPIO_PORTB_PCTL_R &= ~0x000F000;      // configure PB4 as M0PWM2
    GPIO_PORTB_PCTL_R |= 0x0004000;
    GPIO_PORTB_AMSEL_R &= ~0x10;          // disable analog functionality on PB4
    GPIO_PORTB_DEN_R |= 0x10;             // enable digital I/O on PB4 ** double check **
    SYSCTL_RCC_R = 0x00100000 |           // 3) use PWM divider
   (SYSCTL_RCC_R & (~0x000C0000));        //    configure for /16 divider
    
    PWM0_1_CTL_R = 0;                     // 4) re-loading down-counting mode
    PWM0_1_GENB_R = (PWM_1_GENB_ACTCMPBD_ONE|PWM_1_GENB_ACTLOAD_ZERO);

    // PB4 goes low on LOAD
    // PB4 goes high on CMPB down
    PWM0_1_LOAD_R = period - 1;           // 5) cycles needed to count down to 0
    PWM0_1_CMPB_R = duty - 1;             // 6) count value when output rises
    PWM0_1_CTL_R |= 0x00000001;           // 7) start PWM0
    PWM0_ENABLE_R |= 0x00000004;          // enable PB4/M0PWM2 **** check

}

// change duty cycle of PB4
// duty is number of PWM clock cycles output is high  (2<=duty<=period-1)
void PWM0B4_Duty(uint16_t duty)
{
    
    PWM0_1_CMPB_R = duty - 1;             // 6) count value when output rises
}




void PWM0B6_Init(uint16_t period, uint16_t duty)
{

  SYSCTL_RCGCPWM_R |=0x01;                  // 1) activate PWM0 
  SYSCTL_RCGCGPIO_R|=0x02;                  // 2) activate portB
  while ((SYSCTL_PRGPIO_R&0x02) == 0) {};           
  GPIO_PORTB_AFSEL_R |= 0x40;               // enable alt funct on PB6
  GPIO_PORTB_PCTL_R &= ~0x0F000000;         // configure PB6 as PWM0
  GPIO_PORTB_PCTL_R |= 0x04000000;              
  GPIO_PORTB_AMSEL_R &= ~0x40;              // disable analog functionality on PB6
  GPIO_PORTB_DEN_R |= 0x40;                 // enable digital I/O on PB6
  SYSCTL_RCC_R = 0x00100000 |               // 3) use PWM divider
  (SYSCTL_RCC_R & (~0x000C0000));            // configure for /16 divider to C
  PWM0_0_CTL_R = 0;                         // 4) re-loading down-counting mode
  PWM0_0_GENA_R = 0xC8;                     // low on LOAD, high on CMPA down
  // PB6 goes low on LOAD
  // PB6 goes high on CMPA down
  PWM0_0_LOAD_R = period - 1;               // 5) cycles needed to count down to 0
  PWM0_0_CMPA_R = duty - 1;                 // 6) count value when output rises
  PWM0_0_CTL_R |= 0x00000001;               // 7) start PWM0
  PWM0_ENABLE_R |= 0x00000001;              // enable PB6/M0PWM0

}

// change duty cycle of PB6
// duty is number of PWM clock cycles output is high (2<=duty<=period-1)
void PWM0B6_Duty(uint16_t duty)
{

  PWM0_0_CMPA_R = duty - 1; // 6) count value when output rises

}
//PWM时钟速率=处理器时钟速率/SYSCTL\u RCC\u PWMDIV
//=总线时钟/16
//=80 MHz/16=5 MHz
//PB7/M0PWM1上的输出
无效PWM0B4初始(有效期,有效期)
{
易失性无符号长延迟;
SYSCTL_RCGCPWM_R |=0x01;//1)激活PWM0
SYSCTL_RCGCGPIO|u R |=0x02;//2)激活端口B
//delay=SYSCTL\u RCGCGPIO\u R;//允许时间完成激活
而((SYSCTL_PRGPIO_R&0x02)==0{};
GPIO_PORTB_AFSEL_R |=0x10;//在PB4上启用alt函数
GPIO_PORTB_PCTL_R&=~0x000F000;//将PB4配置为M0PWM2
GPIO_端口B_PCTL|u R |=0x0004000;
GPIO_PORTB_AMSEL_R&=~0x10;//禁用PB4上的模拟功能
GPIO_端口B_DEN_R |=0x10;//在PB4上启用数字I/O**双重检查**
SYSCTL_RCC_R=0x00100000 |//3)使用PWM分压器
(SYSCTL_RCC_R&(~0x000c000));//为/16除法器配置
PWM0_1_CTL_R=0;//4)重新加载向下计数模式
PWM0_1_GENB_R=(PWM_1_GENB_ACTCMPBD_ONE | PWM_1_GENB_ACTLOAD_ZERO);
//PB4负载过低
//PB4在CMPB下降时变高
PWM0_1_LOAD_R=周期-1;//5)个周期需要倒计时到0
PWM0_1_CMPB_R=占空比-1;//6)输出上升时的计数值
PWM0_1_CTL|=0x00000001;//7)启动PWM0
PWM0_ENABLE_R|=0x00000004;//启用PB4/M0PWM2****检查
}
//改变PB4的占空比

//占空比是PWM时钟周期数输出很高(2很抱歉,这就是我们在学校一直采用的格式,我应该做些什么来提高可读性?哦,好的,让我来解决,谢谢你确定
PWM0_1*
是正确的吗?据我所知,数据表上说PB4使用模块0 PWM 2。(应该不是
PWM0_2*
?)我最初使用的是PWM0_2,但在数据表中,它还说PB4由模块0 PWM发生器1控制。这就是我使用PWM0_1的原因。您可以发布PB6或PB7的工作代码吗?我不知道您使用的是µC。您确定启用数字IO模式不会禁用alt功能吗?您可以先设置数字IO并禁用模拟你能启用alt功能吗?