STM32F030CT86 定时器3通道1来验证PWM前后切模式

一、相关结构体定义定义及定义一个切换模式变量uint8_t mode = 0;

typedef enum
{
    DIMMER_PWM_CHN1 = 0,
    DIMMER_PWM_CHN2,
    DIMMER_PWM_CHN3,
    DIMMER_PWM_CHN4,
    DIMMER_PWM_CHN5,
    DIMMER_PWM_CHN6,
    DIMMER_CHN_NUM,
}EM_DIMMER_CHx_INDEX;


typedef struct {
    GPIO_TypeDef* GPIOx;
    uint16_t GPIO_Pin;
}DIMMER_STATUS_CONFIG_TABLE;  

typedef struct {
    TIM_TypeDef *TIMx;
    EM_DIMMER_CHx_INDEX PWM_CHx;
}DIMMER_CHx_CONFIG_TABLE; 

typedef struct {
    GPIO_TypeDef* GPIOx;
    uint16_t GPIO_Pin;
    uint8_t  GPIO_PinSourcex;
    uint8_t  GPIO_AF_x;
}DIMMER_IO_CONFIG_TABLE;   

typedef struct {
    TIM_TypeDef *TIMx;
    uint32_t  RCC_APBxPeriph_TIMx;
}DIMMER_TIM_CONFIG_TABLE;

 

二、PWM初始化 配置频率为 f=100Hz,分频系数为psc=4799。默认为后切

const DIMMER_CHx_CONFIG_TABLE dimmer_config_table[] = 
{    
       {TIM3, DIMMER_PWM_CHN1},   
};

/*
#define GPIO_AF_1            ((uint8_t)0x01)  USART2, CEC, TIM3, USART1, IR_OUT,
                                                EVENTOUT, I2C1, I2C2, TIM15 

*/
const DIMMER_IO_CONFIG_TABLE dimmer_io_config_table[] = 
{       
    {GPIOB, GPIO_Pin_4, GPIO_PinSource4, GPIO_AF_1},//PB4
    
};

const DIMMER_TIM_CONFIG_TABLE dimmer_timer_config_table[] = 
{
    {TIM3, RCC_APB1Periph_TIM3},  
};

void pwm_init(void)
{
    uint8_t chn = 0;
    uint16_t ARR_value = 0;
    uint16_t CCR_value = 0;

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* GPIOA, GPIOB and GPIOE Clocks enable */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    
    for(chn = 0; chn < (sizeof(dimmer_io_config_table)/sizeof(dimmer_io_config_table[0])); chn++) {    
        GPIO_PinAFConfig(dimmer_io_config_table[chn].GPIOx, dimmer_io_config_table[chn].GPIO_PinSourcex, dimmer_io_config_table[chn].GPIO_AF_x); 
        GPIO_InitStructure.GPIO_Pin = dimmer_io_config_table[chn].GPIO_Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;                
        GPIO_Init(dimmer_io_config_table[chn].GPIOx, &GPIO_InitStructure);        
    }

    for (chn = 0; chn <(sizeof(dimmer_timer_config_table)/sizeof(dimmer_timer_config_table[0])); chn++) {

        //TODO
        /* Compute the value to be set in ARR regiter to generate signal frequency at 17.57 Khz */
          ARR_value = 99;
          /* Compute CCR1 value to generate a duty cycle at 50% for channel 1 and 1N */
          CCR_value = 0;

          /* timer clock enable */
          if (dimmer_timer_config_table[chn].TIMx == TIM3) {
               RCC_APB1PeriphClockCmd(dimmer_timer_config_table[chn].RCC_APBxPeriph_TIMx, ENABLE);
          }

        /* timer Base configuration */
          TIM_TimeBaseStructure.TIM_Prescaler = 4799;                     
          TIM_TimeBaseStructure.TIM_ClockDivision = 0;
          TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
          TIM_TimeBaseStructure.TIM_Period = ARR_value; 
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
          TIM_TimeBaseInit(dimmer_timer_config_table[chn].TIMx, &TIM_TimeBaseStructure);
        TIM_ARRPreloadConfig(dimmer_timer_config_table[chn].TIMx, ENABLE);
        
        /*    LPC前切   TPC后切 默认后切
            TPC配置:TIM_OCMode_PWM1, TIM_OCPolarity_High
            LPC配置:TIM_OCMode_PWM2, TIM_OCPolarity_High
        */    
          TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
          TIM_OCInitStructure.TIM_Pulse = CCR_value;
          TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
          TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;        
          TIM_OC1Init(dimmer_timer_config_table[chn].TIMx, &TIM_OCInitStructure);
          TIM_OC1PreloadConfig(dimmer_timer_config_table[chn].TIMx, ENABLE);
                    
          /* TIM1 Main Output Enable */
          TIM_CtrlPWMOutputs(dimmer_timer_config_table[chn].TIMx, ENABLE);

          /* TIM1 counter enable */
          TIM_Cmd(dimmer_timer_config_table[chn].TIMx, ENABLE);
    }    
}

三、主程序调用一直循环调用处理

void mmi_relate_test_real_time(void)
{    
    if (1 == mode) {        
        TIM_SetCompare1(TIM3, 100 - 80);
    } else if (0 == mode){
        TIM_SetCompare1(TIM3, 80);
    }
    if (IS_TIMER_EVT(TIME_EVT_1024)) {
        if (1 == mode) {
            debug_top("\r\n------------llllpc---------------\r\n");
        } else {
            debug_top("\r\n------------ttttpc---------------\r\n");
        }
        
    }                        
}

四、 前后切模式配置注意点

LPC前切   TPC后切 默认后切
TPC配置:TIM_OCMode_PWM1, TIM_OCPolarity_High
LPC配置:TIM_OCMode_PWM2, TIM_OCPolarity_High

/*后切*/
void TPC_func(void)
{    
    mode = 0;
    TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM3,TIM_Channel_1, TIM_CCx_Enable);
    
}

/*前切*/
void LPC_func(void)
{        
    mode = 1;
    TIM_SelectOCxM(TIM3, TIM_Channel_1, TIM_OCMode_PWM2);
    TIM_CCxCmd(TIM3,TIM_Channel_1, TIM_CCx_Enable);
}

五、波形示例,验证成功。


         

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值