当前位置:   article > 正文

基于stm32f103rbt6输出固定的占空比_采用stm32f103r6输出占空比为75%的方波

采用stm32f103r6输出占空比为75%的方波

定时器简述

定时器分为普通和高级定时器 他们最大的区别就是在结构体参数的配置上
普通少了一个参数  他们的计算范围都差不多一样  也就是 216次方 0-65535
  • 1
  • 2

定时器适用的场合

用于测量输入脉冲宽度 (输入捕获)或者是测 产生输出波形(输出比较)
每个定时器都是独立的 没有任何共享资源
  • 1
  • 2

时基单元

计数寄存器  (TIMx_CNT)
自动装载值寄存器 (TIMx_ARR)
预分频系数寄存器 (TIMx_PSC)
  • 1
  • 2
  • 3

计数 器

计算定时器的时间  很好理解 
  • 1

自动装载值

自动装载就是预先装载好的 也就是设定好的值  每一次到了某个设定的值
 定时器就会清零 并且发生一次溢出事件。
  • 1
  • 2
这个元素和 计数值 差不多意思  在字面意思 看出 只不过他是可以自动装载的 
也就是 可以变化  他们存放的地址都是一样的。 
  • 1
  • 2

预分频系数
在这里插入图片描述

在我们预分频如果是为1  倍频是不起作用的,如果想加快计算频率 必须改变预分频系数 
可以看出 他们的计算频率明显加快了
  • 1
  • 2

占空比

占空比就是整个周期高电平占的比列
  • 1

代码的思路框架

IO配置的主要的三大组成部分

1  定义结构体 
2 RCC :对应的时钟使能
3 GPIO :配置 对应定时通道的 IO  3 又细分了 三部分 
{
1 模式
2 io
3 频率
}
4 INIT :初始化 GPIOx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

定时器

 1 结构体定义
 2 RCC:对应的时钟使能
 3 TIM 配置 (普通定时器 除了TIM1 TIM8)
 {
 1 模式  TIM_CounterMode
 2 时钟分割线 TIM_ClockDivision
 3 自动装载值 TIM_Period
 4 预分频系数 TIM_Prescaler
 5  TIM_RepetitionCounter (5 是高级定时器 普通定时器不用配置) 
/*****************************************************
 6 使能放在最后面 	TIM_Cmd(TIM2, ENABLE);
 **************************************************/
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

定时器配置注意

3 自动装载值 TIM_Period
4 预分频系数 TIM_Prescaler  
特别注意 这个两个参数 不要 混乱了  
  • 1
  • 2
  • 3
4 预分频系数 TIM_Prescaler =0 预分频就是为0+1(因为从零开始算 ) 倍频不起作用 
例如 TIM_Prescaler =1  我们的定时器是36mhz的 如果预分频是1+1 (TIM_Prescaler =1)倍频起到作用 即得到了 36*2MHZ的频率

再例如 TIM_Prescaler =2   我们的定时器是36mhz的 如果预分频是2+1 (TIM_Prescaler =2)倍频起到作用 也是得到了 36*2M HZ的频率

再例如 TIM_Prescaler =3 我们的定时器是36mhz的 如果预分频是3+1  (TIM_Prescaler =3)倍频起到作用 也是得到了 36*2M HZ的频率
 只要不为1 倍频就起作用 得到的频率是 之前的 两倍 (36*2 M HZ)  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出比较

输出模式 :        1 TIM_OCMode
单向输出使能 :    2TIM_OutputState
输出极性 :        3TIM_OCPolarity
使能自动装载值 :   4TIM_OC2PreloadConfig
初始化 :          5 TIM_OC2Init(x,&xxxxx);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可能会出现的问题

定时器使能不放在最后 假设定时器提前开了 就会导致 输出 模式 卡在后面了 
也就是 我们把最重要的部分给忽略了 
  • 1
  • 2

解决

最后把定时器使能放在最后面  
6 TIM_Cmd(TIM2, ENABLE);
  • 1
  • 2

代码

以PA1为例
在这里插入图片描述

	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitstruct;
	TIM_OCInitTypeDef  TIM_OCInitstruct;
	GPIO_InitTypeDef GPIO_Initstruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	GPIO_Initstruct.GPIO_Pin=GPIO_Pin_1; //对应了TIM2_CH2
	GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Initstruct.GPIO_Mode =GPIO_Mode_AF_PP;//复用推挽就行
	GPIO_Init(GPIOA,&GPIO_Initstruct); 
		
	TIM_TimeBaseInitstruct.TIM_Period=999; //自动装载值为0- 999  即1000
	TIM_TimeBaseInitstruct.TIM_Prescaler=71;//预分频 71+1
	TIM_TimeBaseInitstruct.TIM_CounterMode	=TIM_CounterMode_Up;//向上计数 
	TIM_TimeBaseInitstruct.TIM_ClockDivision  =TIM_CKD_DIV1;//时钟分割线 不分割 
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstruct);//初始化 
		
	TIM_OCInitstruct.TIM_OCMode	 =TIM_OCMode_PWM2;  //输出pwm波形模式
	TIM_OCInitstruct.TIM_OutputState=TIM_OutputState_Enable;//单向输出 使能
	TIM_OCInitstruct.TIM_OCPolarity =TIM_OCPolarity_Low;//输出极性为低
	TIM_OC2Init(TIM2,&TIM_OCInitstruct);//初始化 
	TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能PSC
	TIM_Cmd(TIM2,ENABLE);//使能ARR
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

main.c

	void main(){
	LCD_Clear(White); //清屏为白色 
	LCD_SetBackColor(White);
	LCD_SetTextColor(Blue); 	//字体为 蓝色 
	sprintf((unsigned char *)ccr2_buff,"CCR2:50% ");
	LCD_DisplayStringLine(Line3,ccr2_buff);
	TIM2->CCR2=500;	//1 写法
	//	TIM_SetCompare2(TIM2,500);//2 写法
	while(324);
}
  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出 波形

在这里插入图片描述
补充定时器模式

向上计数模式 : 0-ARR 的过程中 到了ARR 就会自动清零 重新0开始 并且会产生溢出时间
ARR 就是 自动装载值。
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/717233
推荐阅读
  

闽ICP备14008679号