打印

GD32F150 PA15的PWM功能

[复制链接]
1080|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#define BLUE_LED_PIN                GPIO_PIN_15
#define BLUE_LED_GPIO_PORT          GPIOA
#define BLUE_LED_GPIO_CLK           RCU_GPIOA

void led_config(void)
{
//pwm
    rcu_periph_clock_enable(BLUE_LED_GPIO_CLK);
    gpio_mode_set(BLUE_LED_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, BLUE_LED_PIN);
    gpio_output_options_set(BLUE_LED_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,BLUE_LED_PIN);
    gpio_af_set(GPIO_MODE_OUTPUT, GPIO_AF_2, BLUE_LED_PIN);
    led_pwm_config(100,50);//10kHz, 50%  duty_cycle占空比
}

void  led_pwm_config(uint32_t freq_t,uint8_t duty_cycle)
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER1);
    timer_deinit(TIMER1);

    /* TIMER1 configuration */
    timer_initpara.prescaler         = 72-1;  //72分频=72M/72=1KHz时钟频率
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE; //边沿对齐
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;//向上计数
    timer_initpara.period            = freq_t-1;//频率1KHz=72MHz/(71+1)/(999+1), so 0.1KHz=9999
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;//时钟分频1
    timer_initpara.repetitioncounter = 0;//重复计数0
    timer_init(TIMER1,&timer_initpara);//初始化配置

    /* CH0 configuration in PWM mode1 */
    timer_ocintpara.outputstate = TIMER_CCX_ENABLE; //使能输出比较通道
    timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;//输出极性高

    timer_channel_output_config(TIMER1,TIMER_CH_0,&timer_ocintpara);
    timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_0,duty_cycle-1);  
    timer_channel_output_mode_config(TIMER1,TIMER_CH_0,TIMER_OC_MODE_PWM1);
    timer_channel_output_shadow_config(TIMER1,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER1);
    /* auto-reload preload enable */
    timer_enable(TIMER1);
}

使用:duty_val=1-101;
timer_disable(TIMER1);
timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_0,duty_val);
timer_enable(TIMER1);

又是3天3夜,没搞定,有来请教了,哪里搞错了呢?
PA15百度说不支持PWM, 手册里也没看到说不支持。
我就换PA5 结果也不行。

使用特权

评论回复
沙发
sonicll| | 2020-8-24 13:47 | 只看该作者
timer_ocintpara这个结构体在使用之前先做一下初始化:

    /* CH0 configuration in PWM mode1 */
    timer_channel_output_struct_para_init(&timer_ocintpara);
    timer_ocintpara.outputstate = TIMER_CCX_ENABLE; //使能输出比较通道
    timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;//输出极性高
    timer_channel_output_config(TIMER1,TIMER_CH_0,&timer_ocintpara);
    timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_0,duty_cycle-1);  
    timer_channel_output_mode_config(TIMER1,TIMER_CH_0,TIMER_OC_MODE_PWM1);
    timer_channel_output_shadow_config(TIMER1,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER1);
    /* auto-reload preload enable */
    timer_enable(TIMER1);

使用特权

评论回复
板凳
〽️〽️〽️|  楼主 | 2020-8-24 14:07 | 只看该作者
谢谢!
可我不存在这个函数呀?  最新库  V3.1.0, firmware update for GD32F1x0(x=3,5,7,9)     
timer_channel_output_struct_para_init(&timer_ocintpara);

使用特权

评论回复
地板
sonicll| | 2020-8-24 14:27 | 只看该作者
本帖最后由 sonicll 于 2020-8-24 14:51 编辑

我发现你程序的问题了,和那个结构体没关系

void led_config(void)
{
//pwm
    rcu_periph_clock_enable(BLUE_LED_GPIO_CLK);
    gpio_mode_set(BLUE_LED_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, BLUE_LED_PIN);
    gpio_output_options_set(BLUE_LED_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,BLUE_LED_PIN);
    gpio_af_set(GPIO_MODE_OUTPUT, GPIO_AF_2, BLUE_LED_PIN);
    led_pwm_config(100,50);//10kHz, 50%  duty_cycle占空比
}

使用特权

评论回复
5
〽️〽️〽️|  楼主 | 2020-8-24 14:52 | 只看该作者
确实这里有问题,已可以,感谢!

使用特权

评论回复
6
sonicll| | 2020-8-24 14:55 | 只看该作者
〽️〽️〽️ 发表于 2020-8-24 14:52
确实这里有问题,已可以,感谢!

一定要细心啊,就这么个小错误,耽误自己3天时间

使用特权

评论回复
7
gxp6604| | 2020-9-10 11:08 | 只看该作者
这种参数不对,编译不会报错么

使用特权

评论回复
评论
〽️〽️〽️ 2020-9-13 09:55 回复TA
是个宏定义,复制粘贴错了 编译时候代入的实际0,1,2,3,4 什么的值,而实际要求输入 正好也是0,1,2,3,4 这样确实不能编译出错误。 除非本身要求这个参数1000+,内部函数也做错误输出信息 那就可以提示了 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

375

帖子

2

粉丝