GD32用IO口模拟呼吸灯

本文介绍了如何使用C语言控制单片机的IO口实现LED灯的闪烁效果,并扩展到模拟呼吸灯功能。通过按键控制呼吸频率,展示了如何调整LED灯的亮暗周期。核心代码和关键技术如单片机控制、定时器延时、按键中断都被详细讲解。
摘要由CSDN通过智能技术生成

“呼吸灯”其实就是小灯的亮度是逐渐变化的,也就是说,只要能够使用单片机控制小灯的亮度,“呼吸灯”的效果也就实现了。

使用C语言控制单片机IO交替输出高低电平,实现LED小灯的闪烁效果。核心代码如下:

while(1){
        P20 = 0;
        delay(10);
        P20 = 1;
        delay(10);
    }

IO输出的高低电平持续时间都是10个单位,一个完整的周期内,LED小灯的亮灭时间都是相等的。由此可见,使用单片机控制小灯亮度,就是控制一个周期内,LED小灯的亮灭持续时间长短而已。代码如下:


/* IO模拟呼吸灯*/
#include "gd32f30x.h"
#include "gd32f303c_eval.h"
#include "systick.h"

void delay(uint32_t i);

void delay(unsigned int n) {
    char darkTime = 0, dir = 1;
    unsigned int cnt = 0;
     unsigned int x ;
	   while(n--) {
	    x=50;
       while(x--);			 		 
	}
}

void twinkle_once(unsigned char darkTime) {
      gd_eval_led_off(LED2);
	    delay(100-darkTime);
	    gd_eval_led_on(LED2);
	     delay(darkTime);

}
int main(void)
{  
   char darkTime = 0, dir = 1;
    unsigned int cnt = 0;
    gd_eval_led_init(LED2);
    
    while(1){

        cnt ++;
        twinkle_once(darkTime);
        if(cnt == 50){
            cnt = 0;
            if(dir)
                darkTime += 1;
            else
                darkTime -= 1;

            if(darkTime >= 100)
                dir = 0;
            if(darkTime <= 60)
                dir = 1;
        }
    }
}
  

通过按键控制呼吸频率代码如下:



/*
    Copyright (C) 2017 GigaDevice

    2017-06-23, V1.0.0, demo for GD32F30x
*/

/* IO模拟呼吸灯*/
#include "gd32f30x.h"
#include "gd32f303c_eval.h"
#include "systick.h"

uint16_t darkTime = 0, dir = 1;
unsigned int cnt = 0;
uint32_t temp;


void delay(unsigned int n) {
     unsigned int x ;
	   while(n--) {
	    x=50;
       while(x--);			 		 
	}
}
/*闪烁次数*/
void twinkle_once(unsigned char darkTime) {
      gd_eval_led_off(LED2);
	    delay(100-darkTime);
	    gd_eval_led_on(LED2);
	     delay(darkTime);

}
int main(void)
{  
    gd_eval_led_init(LED2);
	 gd_eval_led_init(LED3);
	   

	gd_eval_key_init(KEY_WAKEUP,KEY_MODE_GPIO);
	gd_eval_key_init(KEY_TAMPER,KEY_MODE_GPIO);
    systick_config();
    
    while(1){
				if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
            /* delay 50ms for software removing jitter */
            delay_1ms(50);
            if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){				 
    while(1){

        cnt ++;
        twinkle_once(darkTime);
        if(cnt == 50){
            cnt = 0;
            if(dir)
                darkTime += 8;
            else
                darkTime -= 8;

            if(darkTime >= 100)
                dir = 0;
            if(darkTime <= 60)
                dir = 1;
        }
  }
}
}
}
}
普通定时器可以用来输出SPWM(Sinusoidal Pulse Width Modulation)信号。SPWM是一种通过改变脉冲宽度来控制电机速度的技术。在STM32中,可以通过配置定时器的计数值和比较值来实现SPWM输出。 在给出的代码中,可以看到使用了定时器TIM3来控制PWM输出。在主函数中,通过改变pwm的值来改变脉冲宽度,从而控制电机的转速。当dir为1时,pwm递增,当dir为0时,pwm递减。通过调整pwm的变化速度和范围,可以实现不同的SPWM输出效果。 需要注意的是,这段代码只是一个简单的示例,实际应用中可能需要根据具体的需求进行更多的配置和算法的结合。同时,如果需要更精确的SPWM输出,可以使用更高级的算法和技术,如查表法或者使用FPGA等。 引用\[2\]中提到了PWM技术在生活中的应用,主要是对伺服电机的控制。通过调整PWM波的占空比,可以控制电机的转速或舵机的角度,从而在不同的场合起到不同的作用。 引用\[3\]是一个使用Python计算正弦波对应的PWM值的示例代码。通过计算正弦函数的值,并将其乘以放大倍数,可以得到对应的PWM值。这个示例代码可以帮助理解SPWM的原理和计算方法。 综上所述,普通定时器可以用来输出SPWM信号,通过改变脉冲宽度来控制电机的转速或舵机的角度。具体的实现方法可以根据具体的需求和平台进行配置和算法的结合。 #### 引用[.reference_title] - *1* *2* [stm32定时器输出pwm&IO模拟pwm——呼吸灯](https://blog.csdn.net/wer4567/article/details/127564231)[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^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [GD32E203X单片机输出50HZ SPWM波形](https://blog.csdn.net/weixin_58525635/article/details/128371065)[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^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值