GD32F207VC开发板无法输出互补PWM波形

[复制链接]
265|12
 楼主 | 2018-11-14 19:05 | 显示全部楼层 |阅读模式
本人使用GD32F207VC开发板无法输出互补PWM波形。程序使用高级定时器时钟1,将PA8和PB11设为互补PWM输出引脚。具体程序如下。请各位帮我看一下。谢谢!程序编译无措。

#include "gd32f20x.h"
#include <stdio.h>
#include "systick.h"

int compare ;


void TIM8_init()
{
  TIMER_BaseInitPara tim1_int;// ʱÖÓ1³õʼ»¯
        TIMER_BKDTInitPara tim1_DT; //ʱÖÓ1ËÀÇøʱ¼ä
        TIMER_OCInitPara   tim1_OC; // ʱÖÓ1ͨµÀÉèÖÃ
  tim1_int.TIMER_Period = 1200;// 120Mʱ¿ª¹ØƵÂÊ100k
        tim1_int.TIMER_Prescaler = 0;//¶¨Ê±Æ÷ʱÖÓΪ120M
  tim1_int.TIMER_ClockDivision = TIMER_CDIV_DIV1;//¶¨Ê±Æ÷ʱÖÓΪ120M
        tim1_int.TIMER_CounterMode = TIMER_COUNTER_UP;//ÏòÉϼÆÊý
        TIMER_BaseInit(TIMER1,&tim1_int);
       
        //ÅäÖÃËÀÇøʱ¼ä  ËÀÇøΪ0.1us
       
  tim1_DT.TIMER_ROSState = TIMER_ROS_STATE_ENABLE;
        tim1_DT.TIMER_IOSState = TIMER_IOS_STATE_ENABLE;
        tim1_DT.TIMER_LOCKLevel = TIMER_LOCK_LEVEL_OFF;
        tim1_DT.TIMER_DeadTime = 12;
        tim1_DT.TIMER_Break = TIMER_BREAK_DISABLE;
        tim1_DT.TIMER_BreakPolarity = TIMER_BREAK_POLARITY_LOW;
        tim1_DT.TIMER_OutAuto = TIMER_OUTAUTO_DISABLE ;
  TIMER_BKDTConfig(TIMER1,&tim1_DT);
       
        //ÉèÖÃͨµÀ1£¬Í¨µÀ1N
       
        tim1_OC.TIMER_OCMode = TIMER_OC_MODE_PWM1;//¼ÆÊýֵСÓÚÉ趨ֵΪÓÐЧµçƽ
        tim1_OC.TIMER_OutputState = TIMER_OUTPUT_STATE_ENABLE;//Êä³ö±È½ÏʹÄÜ
        tim1_OC.TIMER_OutputNState = TIMER_OUTPUTN_STATE_ENABLE;//Êä³ö±È½Ï·´ÏòʹÄÜ
        tim1_OC.TIMER_Pulse = compare;//±È½ÏÖµ
        tim1_OC.TIMER_OCPolarity = TIMER_OC_POLARITY_HIGH;//ÓÐЧµçƽΪ¸ßµçƽ
        tim1_OC.TIMER_OCNPolarity = TIMER_OCN_POLARITY_HIGH;//ÓÐЧµçƽΪ¸ßµçƽ
        tim1_OC.TIMER_OCIdleState = TIMER_OC_IDLE_STATE_SET;//¿ÕÏÐʱÒý½Å״̬
        tim1_OC.TIMER_OCNIdleState = TIMER_OCN_IDLE_STATE_RESET;//¿ÕÏÐʱÒý½Å×´
  TIMER_OC1_Init(TIMER1,&tim1_OC);
        TIMER_OC1_Preload(TIMER1,TIMER_OC_PRELOAD_ENABLE);//×Ô¶¯×°ÔØʹÄÜ

  TIMER_Enable(TIMER1,ENABLE);
        TIMER_CtrlPWMOutputs(TIMER1,ENABLE);//¿ªÆôON£¬OCÊä³ö£¨BDTR£©
//        TIMER_CC_PreloadControl(TIMER1,ENABLE);
}


void  PWM_GPIO_init()
{
  GPIO_InitPara GPIO_InitPara;
        RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER1,ENABLE);
        RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOB, ENABLE);
        GPIO_InitPara.GPIO_Pin = GPIO_PIN_8;
        GPIO_InitPara.GPIO_Mode = GPIO_MODE_AF_PP;
        GPIO_InitPara.GPIO_Speed = GPIO_SPEED_50MHZ;
        GPIO_Init(GPIOA,&GPIO_InitPara);//ÅäÖÃPA7Ϊ¸´ÓÃÍÆÍì TM8-CH1N
  GPIO_InitPara.GPIO_Pin = GPIO_PIN_13;
        GPIO_InitPara.GPIO_Mode = GPIO_MODE_AF_PP;
        GPIO_InitPara.GPIO_Speed = GPIO_SPEED_50MHZ;
  GPIO_Init(GPIOB,&GPIO_InitPara);//ÅäÖÃPC6Ϊ¸´ÓÃÍÆÍì TM8-CH1

}

int main(void)
{
        compare = 800;
        TIM8_init();
        PWM_GPIO_init();
       
        while(1)
        {
    compare = 800;
                TIMER_Compare1Config(TIMER1,compare);
       
        }
   
}


 楼主 | 2018-11-15 18:35 | 显示全部楼层
chenyilin 发表于 2018-11-15 12:14
您好,这是对于PA8,PB11 这两个引脚在207中 的功能 , 您可以去查看datasheet

PA8是TM1的1通道啊。程序用的是PB13,上面文字写错了。PB13是TM1的1N通道啊。有什么设置问题吗?谢谢!
 楼主 | 2018-11-15 21:02 | 显示全部楼层
本帖最后由 xiaobai032 于 2018-11-15 21:29 编辑
chenyilin 发表于 2018-11-15 19:20
PB11 和PA8,一个是CH1,一个是CH4,他们只是能输出PWM ,不代表能输出互补通道,对于互补通道的引脚说明应 ...

是PB13,不是PB11.PB13是CH1N

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-11-16 10:20 | 显示全部楼层
xiaobai032 发表于 2018-11-15 21:02
是PB13,不是PB11.PB13是CH1N

您好,您可以到官网上下载最新的关于207的datasheet,上面有做标明,




如果您使用的是TIM1 那么修改为timer 0 试试。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-11-16 20:41 | 显示全部楼层
本帖最后由 xiaobai032 于 2018-11-16 20:51 编辑
chenyilin 发表于 2018-11-16 10:20
您好,您可以到官网上下载最新的关于207的datasheet,上面有做标明,

您好,我用的是跟板子一起提供的库函数。库函数中时钟只有1到14.没有时钟0.那应该怎么办。你提供的图应该时钟编号为0-13.与我的库函数不符?怎么办?改为timer0直接报错。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-11-20 11:33 | 显示全部楼层
我这边按照您的库 改了一个代码 你测试一下;

/* Includes ------------------------------------------------------------------*/
#include <gd32f20x.h>
#include "systick.h"
#include <stdio.h>

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM_Configuration(void);

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Configure system clocks.
  * @param  None
  * @retval None
  */
void RCC_Configuration(void)
{
    /* GPIOA, GPIOB, GPIOC and AF clocks enable */
    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOB |
                                RCC_APB2PERIPH_GPIOC | RCC_APB2PERIPH_AF, ENABLE);
}

/**
  * @brief  Configure the GPIO ports.
  * @param  None
  * @retval None
  */
void GPIO_Configuration(void)
{
    GPIO_InitPara GPIO_InitStructure;

    /* Configure PC7 as PP output */
    GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_7;
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_OUT_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOC,&GPIO_InitStructure);

    /* Configure PA8 PA9 PA10(TIMER1 CH1 CH2 CH3) as alternate function */
    GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    /* Configure PB13 PB14 PB15(TIMER1 CH1N CH2N CH3N) as alternate function */
    GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
}

/**
  * @brief  Configure the TIMER peripheral.
  * @param  None
  * @retval None
  */
void TIM_Configuration(void)
{
/* -----------------------------------------------------------------------
    TIMER1 Configuration to:
    Generate 3 complementary PWM signals with 3 different duty cycles:
    TIMER1CLK is fixed to SystemCoreClock, the TIMER1 Prescaler is equal
    to 6000 so the TIMER1 counter clock used is 20KHz.

    The Three Duty cycles are computed as the following description:
    The channel 1 duty cycle is set to 25% so channel 1N is set to 75%.
    The channel 2 duty cycle is set to 50% so channel 2N is set to 50%.
    The channel 3 duty cycle is set to 75% so channel 3N is set to 25%.
  ----------------------------------------------------------------------- */
    TIMER_BaseInitPara TIM_TimeBaseStructure;
    TIMER_OCInitPara  TIM_OCInitStructure;

    /* TIMER1 clock enable */
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER1, ENABLE);

    /* TIMER1  configuration */
    TIMER_DeInit(TIMER1);
    TIM_TimeBaseStructure.TIMER_Prescaler     = 5999;
    TIM_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
    TIM_TimeBaseStructure.TIMER_Period        = 15999;
    TIM_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
    TIMER_BaseInit(TIMER1,&TIM_TimeBaseStructure);

    /* CH1,CH2 and CH3 Configuration in PWM mode */
    TIM_OCInitStructure.TIMER_OCMode       = TIMER_OC_MODE_PWM1;
    TIM_OCInitStructure.TIMER_OCPolarity   = TIMER_OC_POLARITY_HIGH;
    TIM_OCInitStructure.TIMER_OCNPolarity  = TIMER_OCN_POLARITY_HIGH;
    TIM_OCInitStructure.TIMER_OutputState  = TIMER_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.TIMER_OutputNState = TIMER_OUTPUTN_STATE_ENABLE;
    TIM_OCInitStructure.TIMER_OCIdleState  = TIMER_OC_IDLE_STATE_RESET;
   
    TIM_OCInitStructure.TIMER_Pulse = 3999;
    TIMER_OC1_Init(TIMER1, &TIM_OCInitStructure);
    TIMER_OC1_Preload(TIMER1,TIMER_OC_PRELOAD_DISABLE);
   
    TIM_OCInitStructure.TIMER_Pulse = 7999;
    TIMER_OC2_Init(TIMER1, &TIM_OCInitStructure);
    TIMER_OC2_Preload(TIMER1,TIMER_OC_PRELOAD_DISABLE);

    TIM_OCInitStructure.TIMER_Pulse = 11999;
    TIMER_OC3_Init(TIMER1, &TIM_OCInitStructure);
    TIMER_OC3_Preload(TIMER1,TIMER_OC_PRELOAD_DISABLE);

    /* TIMER1 output enable */
    TIMER_CtrlPWMOutputs(TIMER1,ENABLE);
    /* Auto-reload preload enable */
    TIMER_CARLPreloadConfig(TIMER1,ENABLE);
    /* TIMER enable counter*/
    TIMER_Enable( TIMER1, ENABLE );
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main()
{
    RCC_Configuration();
    GPIO_Configuration();
    SysTick_Configuration();
    TIM_Configuration();

    while(1)
    {
        GPIO_SetBits(GPIOC,GPIO_PIN_7);
        Delay_1ms(1000);
        GPIO_ResetBits(GPIOC, GPIO_PIN_7);
        Delay_1ms(1000);
    }
}

这是测试PA8 -PB13引脚的波形图


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-11-20 18:23 | 显示全部楼层
kkkkk
| 2018-11-20 18:23 | 显示全部楼层
 楼主 | 2018-11-20 19:49 | 显示全部楼层
chenyilin 发表于 2018-11-20 11:33
我这边按照您的库 改了一个代码 你测试一下;

/* Includes -------------------------------------------- ...

问题已经找到,万分感谢!!因为我的gpio配置中含有rcc时钟设置,里面开启了timer1时钟。但在main函数中把gpio函数放在了timer1设置函数之后。将两个函数位置颠倒,就有输出了。是不是timer1的rcc时钟不开,配置不了timer1?
| 2018-11-22 10:19 | 显示全部楼层
xiaobai032 发表于 2018-11-20 19:49
问题已经找到,万分感谢!!因为我的gpio配置中含有rcc时钟设置,里面开启了timer1时钟。但在main函数中 ...

嗯嗯~ 真棒。你说的是对的
| 2018-11-25 10:46 | 显示全部楼层
这个跟定时器的应用有关的
| 2018-11-30 21:41 | 显示全部楼层
xiaobai032 发表于 2018-11-20 19:49
问题已经找到,万分感谢!!因为我的gpio配置中含有rcc时钟设置,里面开启了timer1时钟。但在main函数中 ...

原来是这样,我也是听你说的才反应过来了,确实是这个问题。
| 2018-11-30 21:41 | 显示全部楼层
chenyilin 发表于 2018-11-22 10:19
嗯嗯~ 真棒。你说的是对的

初始化的时候一定要注意的。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表