基于stm32f103rbt6输出固定的占空比

定时器简述

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

定时器适用的场合

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

时基单元

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

计数 器

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

自动装载值

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

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

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

占空比

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

代码的思路框架

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

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

定时器

 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);
 **************************************************/
 }

定时器配置注意

3 自动装载值 TIM_Period
4 预分频系数 TIM_Prescaler  
特别注意 这个两个参数 不要 混乱了  
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 TIM_OCMode
单向输出使能 :    2TIM_OutputState
输出极性 :        3TIM_OCPolarity
使能自动装载值 :   4TIM_OC2PreloadConfig
初始化 :          5 TIM_OC2Init(x,&xxxxx);

可能会出现的问题

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

解决

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

代码

以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

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);
}
  

输出 波形

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

向上计数模式 : 0-ARR 的过程中 到了ARR 就会自动清零 重新0开始 并且会产生溢出时间
ARR 就是 自动装载值。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值