基于stm32f103rct6的呼吸灯实现

一、输出比较(OC)

在stm32中,输出比较即OC(Output Compare),输出比较可以通过比较CNT(计数器)与CCR(捕获/比较寄存器)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

一、PWM

PWM(脉冲宽度调制)

在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟,常用于电机控制速度等领域。

在stm32中,用于输出pwm的方式有很多,第一种是可以用普通IO口输出pwm,第二种是利用定时器的pwm的IO口或复用IO口。

①pwm端口:

STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出

②普通IO口:

一般能够输出PWM的端口都会在主要功能那一栏出现CHx的标志,而普通定时器没有出现这种标志。

       我们可以通过改变灯的有效电压占空比来实现呼吸灯效果。其中我们要用到PWM(脉宽调制),通过pwm我们可以来改变高电平的占空比

        ·占空比:在一个周期中,高电平所占整个周期的百分比

具体如图:

当我们用pwm来生成呼吸灯时,因为在stm32f103rct6中PA8LED灯是通过给PA8输入一个低电平点亮的,所以低电平在一个周期中维持的时间越长,灯越亮。

具体实现看代码:

void Pwm_Init()
{
    GPIO_InitTypeDef  	GPIO_InitStruct;
	TIM_OCInitTypeDef 	TIM_OCInitStruct;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
    /*1、使能时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA |RCC_APB2Periph_TIM1,ENABLE);
    
    /*2、配置GPIO*/
	GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_8;  		//引脚8 LED1
	GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;		//复用
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度
	GPIO_Init(GPIOA,&GPIO_InitStruct);	
	 
	
	//4、初始化定时器,配置ARR,PSC。
	TIM_TimeBaseInitStruct.TIM_Prescaler	= psc; 	//分频系统  ,每秒数多少个数 
	TIM_TimeBaseInitStruct.TIM_Period		= per; 	//重装值
	TIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0x00;
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);		

	/*配置pwm*/
	TIM_OCInitStruct.TIM_OCMode		=  TIM_OCMode_PWM1; 	  //PWM1模式
	TIM_OCInitStruct.TIM_OutputState=  TIM_OutputState_Enable;//输出使能
	TIM_OCInitStruct.TIM_OCPolarity =  TIM_OCPolarity_Low; 	  //极性低
	TIM_OCInitStruct.TIM_Pulse = 0x00;
	TIM_OC1Init(TIM1,&TIM_OCInitStruct);
	//5、使能预装载寄存器: 
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); 
	
	//6、使能自动重装载的预装载寄存器允许位	
	TIM_ARRPreloadConfig(TIM1,ENABLE);

	/*pwm输出通道使能*/
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
		
	//7、使能定时器。
	TIM_Cmd(TIM1,ENABLE);

}

 主函数:


void HardWare_Init(void)
{
	SysTick_Init(72);
	Pwm_Init(100-1,7200-1);
}

int main(void)
{
	u8 cnt = 0;
	u8 fx = 1;
	HardWare_Init();
	while(1)
	{
		if(fx)
		{
			cnt++;
			if(cnt>99)
				{
					fx = 0;
				}
		}
		else
		{
			cnt--;
			if(cnt < 1)
			{
				fx = 1;
			}
		}
		TIM_SetCompare1(TIM1,cnt);
		delay_ms(20);
	}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F103RCT6系统定时器是指在STM32F103RCT6芯片上的定时器模块。该芯片上有多个定时器,包括TIM2、TIM6和TIM7等。这些定时器具有不同的功能和特点。 其中,TIM2定时器可以用于产生PWM信号。要在STM32F103RCT6上产生一个40kHz的PWM信号,可以选择使用TIM2定时器。首先,需要配置TIM2的时钟源和预分频系数,以获得正确的计数时钟。将计数器的周期设置为1800,即72MHz/40kHz,以便每个PWM周期的持续时间是25us。\[2\] 另外,STM32F103RCT6还有TIM6和TIM7定时器。这两个定时器的主要功能包括16位自动重装载累加计数器、16位可编程预分频器、触发DAC的同步电路以及在更新事件时产生中断/DMA请求等。这些定时器可以用于各种定时和计数应用。\[3\] 总结来说,STM32F103RCT6系统定时器包括TIM2、TIM6和TIM7等,可以用于产生PWM信号、定时和计数等应用。 #### 引用[.reference_title] - *1* [STM32F103RCT6 定时器相关常用函数](https://blog.csdn.net/weixin_50212044/article/details/130831252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32F103RCT6 -- 定时器TIM2 输出 PWM 波形](https://blog.csdn.net/weixin_50212044/article/details/130828996)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32F103RCT6——定时器简单用法](https://blog.csdn.net/Drowningxml/article/details/129097025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钜锋王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值