乐趣区

基于PWM调宽的呼吸灯算法

本文提供基于 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;
}
}

退出移动版