PWM输出,呼吸灯

一、初始化GPIO

使用PB1,查芯片手册对应TIM3_CH4
  1.     GPIO_InitTypeDef GPIO_InitStructure;
  2.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  3.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

  4.     
  5.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  6.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  7.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.     
  9.     GPIO_Init(GPIOB, &GPIO_InitStructure);

二、初始化TIM和PWM


  1.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  2.     TIM_OCInitTypeDef TIM_OCInitStructure;

  3.     /* 周期1000 */
  4.     TIM_TimeBaseStructure.TIM_Period = 999;
  5.     /* 定时器时间间隔1微秒 */
  6.     TIM_TimeBaseStructure.TIM_Prescaler = 0;
  7.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  8.     /* 向上计数 */
  9.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  10.     /* 配置 */
  11.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  12.     
  13.     /* 选择PWM1模式 */
  14.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  15.     /* 允许输出模式 */
  16.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
  17.     /* 匹配值 */
  18.     TIM_OCInitStructure.TIM_Pulse = 1000;    
  19.     /* 设置小于匹配值时为高电平 */
  20.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  21.     /* 使能通道1 */
  22.     TIM_OC4Init(TIM3, &TIM_OCInitStructure);    
  23.     
  24.     TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  25.     TIM_ARRPreloadConfig(TIM3, ENABLE);
  26.     TIM_Cmd(TIM3, ENABLE);

三、main函数部分

通过修改CCRx寄存器,改变占空比。从而调整电流大小
  1. while(1)
  2. {
  3.         if(CCR3_Val >=0 && CCR3_Val <= 1000)
  4.         {
  5.             CCR3_Val -= 50;
  6.             Delay(1);
  7.         }
  8.         else
  9.         {
  10.             CCR3_Val = 1000;
  11.             Delay(1);
  12.         }
  13.         TIM3->CCR4 = CCR3_Val;
  14.         Delay(1);
  15. }

<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(9) | 评论(0) | 转发(0) |
0

上一篇:SysTick功能总结

下一篇:mpu6050学习

给主人留下些什么吧!~~
评论热议
### GPIO模拟PWM输出实现呼吸效果 在实现GPIO模拟PWM输出以控制呼吸效果时,可以通过调整占空比和周期来模拟PWM信号。以下是具体实现方式: #### 1. 基本原理 通过软件延迟或循环控制GPIO的高低电平切换时间,从而形成一个近似PWM的信号。占空比的变化可以控制LED亮度,而周期决定了PWM频率[^1]。 #### 2. 实现代码示例 以下是一个基于C语言的GPIO模拟PWM输出实现呼吸效果的代码示例: ```c #include <reg52.h> // 51单片机头文件 sbit LED = P1^0; // 定义LED连接到P1.0引脚 #define PWM_CYCLE 100 // PWM周期 #define BRIGHTNESS_MAX 100 // 最大亮度值 #define DELAY_TIME 1000 // 延时时间 void delay(unsigned int time) { while (time--) { for (volatile unsigned int i = 0; i < 1000; i++); // 简单延时函数 } } void breath_led() { static unsigned char brightness = 0; // 当前亮度值 static signed char direction = 1; // 亮度变化方向 // 改变LED亮度 for (unsigned char i = 0; i < PWM_CYCLE; i++) { if (i < brightness) { LED = 0; // 高电平(LED亮) } else { LED = 1; // 低电平(LED灭) } delay(DELAY_TIME / PWM_CYCLE); // 控制PWM周期 } // 调整亮度值 brightness += direction; if (brightness >= BRIGHTNESS_MAX) { direction = -1; // 达到最大亮度后开始减小 } else if (brightness <= 0) { direction = 1; // 达到最小亮度后开始增大 } } void main() { while (1) { breath_led(); // 循环调用呼吸函数 } } ``` #### 3. 代码说明 - **PWM_CYCLE**:定义了PWM的一个完整周期包含的步数。 - **BRIGHTNESS_MAX**:定义了LED的最大亮度值,即占空比的最大值。 - **delay函数**:用于产生一定的延时,模拟PWM周期中的高电平和低电平时间[^4]。 - **breath_led函数**:通过改变占空比实现LED亮度的渐变效果。每次循环中,根据当前亮度值设置GPIO的高低电平,并通过延时控制PWM周期。 #### 4. 注意事项 - 使用`for`循环控制PWM周期会占用较多CPU资源,因此在实际应用中不建议用于复杂系统。 - 如果需要更精确的控制,可以考虑使用硬件定时器中断来生成PWM信号[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

习惯就好zz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值