zoukankan      html  css  js  c++  java
  • 了解Timer以及TIM_RepetitionCounter参数的作用——TimerTimer

    当 TIM_RepetitionCounter 参数设置为0 时,时间周期不翻倍。

    当 TIM_RepetitionCounter 参数设置为1 时,时间周期翻1倍。
    当 TIM_RepetitionCounter 参数设置为2 时,时间周期翻2倍。

    1

    如下,定时了0.001s,然后在中断中计数1000次,点亮熄灭LED,正常情况来说,led会亮1s,然后灭1s,,,不断重复。
    当 TIM_RepetitionCounter 参数设置为0 时,确实是1s。
    image
    image
    当 TIM_RepetitionCounter 参数设置为1 时,明显感觉到亮灭的时间被延长了一倍。
    所以 TIM_RepetitionCounter 应该是在本次定时结束后,再重装载定时 1次,进入中断,所以

    当TIM_RepetitionCounter =1时,相当于定时0.001s ,计时1S满2次之后进入中断,那么led的亮灭时间就变成了2s。

    当TIM_RepetitionCounter =2时,相当于定时0.001s ,计时1S满3次之后进入中断,那么led的亮灭时间就变成了3s。

    2

    这次看懂一个 定时器的通道输出PWM 用于控制 一盏小灯的亮灭。
    以下是全部内容,主要是害怕作者把东西给删除了,或者说放在那里我就不会去看了,写在自己家比较安心,所以必须狠狠记下。
    原文链接:http://bbs.eeworld.com.cn/thread-1076944-1-1.html

    本次实验的主要目的是为后期的实战做前期准备,利用GD32E231C_START评估板上的用户按键“KEY”控制定时器"TIMER2_CH1"的PWM输出,用以改变LED1的亮度。

    一、实验资源

    1、GD32E231C_START评估板;
    2、Keil v5.27.1.0;
    3、GigaDevice.GD32E23x_DFP.1.0.0.pack;
    4、GD32E23x_Demo_Suites_V1.0.1;
    5、GD32E231C_START开发板相关文档;
    6、逻辑分析仪。

    二、实验过程

    1、资源配置。

    GD32E231C8T6具有非常丰富的定时器资源,这其中包括1个高级定时器TIMER0;5个通用定时器TIMER(2,13~16);1个基本定时器TIMER5,当然还包括RTC等等。
    结合数据手册及评估板原理图可以看到四个LED分别受控于PA7、PA8、PA11、PA12引脚,其中的PA7引脚的复用功能包含了通用定时器TIMER2的“TIMER2_CH1”,同时PB5引脚同样也可复用为“TIMER2_CH1”,正好PB5已被“JP9”引出方便外部测试,于是本次实验的定时器资源使用了通用定时器TIMER2。
    还有就是利用了接在PA0上按键“KEY”,高电平有效,用以调整PWM输出信号的占空比。
    imageimageimageimage

    2、程序实现。

    参考了官方提供的例程,首先PA7引脚进行相应配置,要注意的是打开PA7引脚“TIMER2_CH1”的复用功能“AF1”;然后对TIMER2_CH1通道PWM输出进行相应配置并使能PWM输出。

    下面是主函数:

    int main(void)
    {
    	systick_config();
    
    	KEY_PORT_Init();
    	PWM_Config();
    	while(1)
    	{
    		KEY_Scan();//用于调整PWM输出占空比
    	}
    }
    
    
    #define PWM_OUT_PORT            GPIOA
    #define PWM_OUT_PIN             GPIO_PIN_7
    #define PWM_OUT_PORT_CLK        RCU_GPIOA
    

    “TIMER2_CH1”通道PWM输出配置函数:

    void PWM_Config(void)
    {
    		timer_oc_parameter_struct 			timer_ocintpara;
    		timer_parameter_struct 				timer_initpara;
    		rcu_periph_clock_enable(PWM_OUT_PORT_CLK);
    		rcu_periph_clock_enable(RCU_TIMER2);
    
    		gpio_mode_set(PWM_OUT_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE ,PWM_OUT_PIN);
    		gpio_output_options_set(PWM_OUT_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,PWM_OUT_PIN);//PA7(TIMER2_CH1)
    		gpio_af_set(PWM_OUT_PORT,GPIO_AF_1,PWM_OUT_PIN);//配置PA7引脚复用功能为TIEMR2_CH1
    
    		timer_deinit(TIMER2);
    
    		/* TIMER2 configuration */
    		timer_initpara.prescaler         = 719;//预分频器值72M/(719+1)=100KHz
    		timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;//对齐模式
    		timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    		timer_initpara.period            = 999;//周期值,此值确定了PWM输出的周期
    		timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;//时钟分频值
    		timer_initpara.repetitioncounter = 0;//计数器重复值
    		timer_init(TIMER2,&timer_initpara);
    
    		 /* CH0 configuration in PWM mode */
    		timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
    		timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
    		timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;
    		timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    		timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
    		timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
    		timer_channel_output_config(TIMER2,TIMER_CH_1,&timer_ocintpara);
    
    		timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);
    		timer_channel_output_mode_config(TIMER2,TIMER_CH_1,TIMER_OC_MODE_PWM0);
    		timer_channel_output_shadow_config(TIMER2,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
    
    		timer_primary_output_config(TIMER2,ENABLE);
    		timer_auto_reload_shadow_enable(TIMER2);
    		timer_enable(TIMER2);
    }
    

    按键函数:

    void KEY_Scan(void)
    {
    	static uint8_t num=0;
    
    	if(KEY==1)
    	{
    		delay_1ms(20);
    		if(KEY==1)
    		{
    			num++;
    			if(num==5)
    			num=1;
    		}
    
    		switch (num)
    		{
    				case 1:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,900);break;        //占空比90%
    				case 2:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,650);break;        //占空比65%
    				case 3:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,300);break;        //占空比30%
    				case 4:timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_1,0);break;                //占空比0
    				default:break;
    		}
    		while(KEY==1);
    	}
    }
    

    3、实验结果

    image

    4、测试占空比

      为方便测试,将“TIMER2_CH1”通道PWM输出功能转移至PB5引脚,直接在预定义中修改:
    
    #define PWM_OUT_PORT                        GPIOB
    #define PWM_OUT_PIN                         GPIO_PIN_5
    #define PWM_OUT_PORT_CLK         			RCU_GPIOB
    

    然后接上逻辑分析仪进行测试,通过按键“KEY”可对输出信号的占空比进行相应的调整,测试如下:

  • 相关阅读:
    MySQL教程(四)—— MySQL的登录与退出
    MySQL教程(三)—— MySQL的安装与配置
    django中使用POST方法报错 URL via POST, but the URL doesn't end in a slash
    django的html模板中获取字典的值
    使用pycharm手动搭建python语言django开发环境(五) 使用日志模块打日志
    使用pycharm手动搭建python语言django开发环境(四) django中buffer类型与str类型的联合使用
    python语言 buffer类型数据的使用 'ascii' codec can't decode byte 0xe5 问题的解决
    使用pycharm手动搭建python语言django开发环境(三) 使用django的apps应用 添加应用静态文件
    使用pycharm手动搭建python语言django开发环境
    使用pycharm手动搭建python语言django开发环境(一)
  • 原文地址:https://www.cnblogs.com/xuyan123/p/14932067.html
Copyright © 2011-2022 走看看