基于PWM调宽的呼吸灯算法

WindChaser 2019-07-01

本文提供基于Texas Instruments 公司开发的Tiva C Series的系统板 ––—- TM4C123GH6PM ,以及DY - Tiva - PB v3.0 的拓展板实现呼吸灯算法。
核心思路是通过循环调整亮灭的时间,总时间一定,使灭的时间与亮的时间成反比

int i = 0, j = 0, flag = 0;
    int m = 180, n = 180, t = 180, q = 180;
        
    //设置系统时钟为50MHz
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                       SYSCTL_XTAL_16MHZ);
    // 端口GPIO F使能,F0引脚解锁NMI功能
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);            // 使能 GPIO F模块
    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;   // 开锁 PORT F
    HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= GPIO_PIN_0;       // 解锁 F0 引脚
    HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0;               // 重新上锁        
    // 设置GPIO方向    
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);     // PF0设置为输出
    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_0,1<<0);          // 蓝LED灯初始态:灭
    // 设置PA4为输出    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);            // 使能 GPIO A模块
    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4);     // PA4设置为输出
    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,1<<4);          // 绿LED灯初始态:灭
    // 设置PD6为输出    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);            // 使能 GPIO D模块
    GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_6);     // PD6设置为输出
    GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,1<<6);          // 红LED灯初始态:灭
//        
    while(1)    // 死循环,main函数没有结束
    {
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0 << 0);          // 蓝色LED灯:亮
        for(i = m; i > 0; i--) for(j = m; j > 0; j--);              // 软件延时
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 1 << 0);          // 蓝色LED灯:灭
        for(i = q - m; i > 0; i--) for(j = q - m; j > 0; j--);      // 软件延时
            
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0 << 4);          // 绿色LED灯:亮
        for(i = m; i > 0; i--) for(j = m; j > 0; j--);              // 软件延时
        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 1 << 4);          // 绿色LED灯:灭
        for(i = n - m; i > 0; i--) for(j = n - m; j > 0; j--);        // 软件延时
                
        GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 0 << 6);          // 红色LED灯:亮
        for(i = m; i > 0; i--) for(j = m; j > 0; j--);              // 软件延时
        GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_6, 1 << 6);          // 红色LED灯:灭
        for(i = t - m; i > 0; i--) for(j = t - m; j > 0; j--);      // 软件延时
            
        if((m == 0) && (flag == 0))
            flag = 1;
        if(!flag)
            m--;
        else
        {
            if(m < n)
                m++;
            else 
                flag = 0;
        }
    }