314|1

22

帖子

0

资源

一粒金砂(中级)

【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】PWM 呼吸灯 [复制链接]

【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】PWM 呼吸灯

很荣幸能获得雅特力AT32WB415系列蓝牙BLE 5.0 MCU的评测机会,为此按照我以前的评测的习惯,附上我的

提示词:如果您需要查看本帖隐藏内容,请登录或者注册
:,所有评测代码均开源分享。

如果因为网络问题无法进入Github可以在Gitee中下载,可能会存在没有及时更新。Gitee:

提示词:如果您需要查看本帖隐藏内容,请登录或者注册

一、PWM分析

    

image.png

    查看一下灯PB9的引脚,判断是否有PWM产生。

image.png

    我们再来分析一下AT32的PWM的配置,我们可以看到,Tme4是通用定时器,产生PWM。

image.png      控制PWM输出的是有Cxdt来的,我们再库函数中也能看到。

image.png

 

image.png

    具体的pwm的原理就不多说,大家感兴趣的可以参考STM32的教程:(13条消息) STM32控制舵机讲解,从入门到放弃。_KING_阿飞的博客-CSDN博客_stm32控制舵机的例程详细解释

二、代码配置

      我们首先看结构体里面,

/**
  * @brief  tmr output config type
  */
typedef struct
{
  tmr_output_control_mode_type           oc_mode;             /*!< output channel mode */
  confirm_state                          oc_idle_state;       /*!< output channel idle state */
  confirm_state                          occ_idle_state;      /*!< output channel complementary idle state */
  tmr_output_polarity_type               oc_polarity;         /*!< output channel polarity */
  tmr_output_polarity_type               occ_polarity;        /*!< output channel complementary polarity */
  confirm_state                          oc_output_state;     /*!< output channel enable */
  confirm_state                          occ_output_state;    /*!< output channel complementary enable */
} tmr_output_config_type;

      oc_mode 配置模式

    oc_idle_state;        输出通道的空闲状态
    occ_idle_state;      输出互补通道空闲状态
    oc_polarity;            输出通道极性
    occ_polarity;          输出互补通道极性
    oc_output_state;    输出通过使能

     occ_output_state  输出互补通道使能

 

具体配置:

gpio_init_type gpio_init_struct;
	tmr_output_config_type tmr_oc_init_structure;
	uint16_t div_value = 0;
	
	/* tmr4 clock enable */
  crm_periph_clock_enable(CRM_TMR4_PERIPH_CLOCK, TRUE);

  /* gpioa gpiob clock enable */
  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

  gpio_default_para_init(&gpio_init_struct);

  gpio_init_struct.gpio_pins = GPIO_PINS_9;
  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init(GPIOB, &gpio_init_struct);
	
	/* compute the div value */
  div_value = (uint16_t)(system_core_clock / 24000000) - 1;

  /* tmr4 time base configuration */
  tmr_base_init(TMR4, 665, div_value);
  tmr_cnt_dir_set(TMR4, TMR_COUNT_UP);
  tmr_clock_source_div_set(TMR4, TMR_CLOCK_DIV1);

  tmr_output_default_para_init(&tmr_oc_init_structure);
  tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
  tmr_oc_init_structure.oc_idle_state = FALSE;
  tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
  tmr_oc_init_structure.oc_output_state = TRUE;

  tmr_output_channel_config(TMR4, TMR_SELECT_CHANNEL_4, &tmr_oc_init_structure);
  tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_4, 83);
  tmr_output_channel_buffer_enable(TMR4, TMR_SELECT_CHANNEL_4, TRUE);

  tmr_period_buffer_enable(TMR4, TRUE);

  /* tmr enable counter */
  tmr_counter_enable(TMR4, TRUE);
uint16_t period, pulse, dir;

  period = 665;
  dir = 1;           
  pulse = 0;          	
	while(1){
		
		vTaskDelay(50);
    if (dir)
    {
            pulse += 30;      
    }
    else
    {
            pulse -= 30;     
    }
				
    if (pulse >= period)
    {
          dir = 0;
    }
        
		if (0 == pulse) 
		{
           
			dir = 1;
       
		}
		tmr_channel_value_set(TMR4, TMR_SELECT_CHANNEL_4, pulse);
       
	}

 

三、效果展示

VID_20220803_121449

 

此帖出自RF/无线论坛

回复

1812

帖子

3

资源

版主

这三个灯配合非常棒,感谢分享。

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表