CW32数字电压电流表软件教程(一):LED原理与驱动基础知识详解

描述

2.1.LED灯基础知识

2.1.1.LED灯结构组成

LED灯,也称发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。LED的内部是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,整个晶片环-氧树脂封装起来。常见的LED灯如图2-1所示。

LED驱动

图2-1 常见LED灯

2.1.2.LED灯发光原理

半导体晶片由两部分组成,一部分是P型半导体,另一端是N型半导体。这两种半导体连接起来的时候,它们之间就形成了一个P-N结。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED灯发光的原理。

2.1.3.LED灯驱动原理

LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。

LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的正负极即可驱动。LED的接法也分有两种,灌入电流和输出电流。

LED驱动

图2-2 LED接法示例

灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。

输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。

需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。

2.2.LED灯原理图

CW32F003小蓝板关于LED灯的原理图如图2-3所示

LED驱动

LED驱动

图 2-3 小蓝板LED灯原理图

2.3.LED灯驱动流程(库函数)

通过上面的原理图可以了解到,LED2中负极接到了电源地,LED2的正极经限流电阻R3连接到电源正。当核心板上电时,使LED2导通,这时便有电流流过发光二极管LED2,使LED2发光指示电源接入;

LED1的正极经限流电阻R5接到电源正极,LED1的负极连接到单片机的GPIO口上,通过LED灯的驱动原理,只需要将相应GPIO(PC0)配置为低电平即可点亮LED1。CW32F003小蓝板的LED部分实物图如图2-4所示

LED驱动

图 2-4 小蓝板LED实物图

2.3.1.配置流程

一般我们使用GPIO的端口,都需要有以下几个步骤。

开启GPIO的端口时钟

配置GPIO的模式

配置GPIO的输出

从开发板原理图了解到LED2接的是单片机的PC0。我们要使能LED就需要配置GPIOC端口。下面我们就以LED1接的PC0进行介绍。

2.3.1.1.开启CW32F003系统内部时钟

CW32的系统内部时钟默认并不是我们想要的运行频率,在使用CW32之前我们需要先配置内部时钟树。查找CW32F003的用户手册可以找到系统内部时钟树如下图:

LED驱动

图2-5 CW32F003内部时钟树

在CW32的库函数中找到cw32f003_rcc.h,头文件中有时钟树相关配置的函数,如下图:

LED驱动

图2-6 时钟树相关配置函数

 

void RCC_Configuration(void)
{
  FLASH_SetLatency(FLASH_Latency_2); // 设置主频为48MHZ需要注意,Flah的访问周期需要更改为FLASH_Latency_2。
  RCC_HSI_Enable(RCC_HSIOSC_DIV1);   // 设置频率为48M
  RCC_SYSCLKSRC_Config(RCC_SYSCLKSRC_HSI);  //选择SYSCLK时钟源  48MHz
  RCC_HCLKPRS_Config(RCC_HCLK_DIV1);  //配置SYSTICK到HCLK分频系数  48MHz
  RCC_PCLKPRS_Config(RCC_PCLK_DIV8); //配置HCLK 到 PCLK的分频系数  6MHz
}

 

2.3.1.2.开启GPIO的端口时钟

CW32的外时钟默认是全部关闭,使用GPIO外设之前我们需要先开启对应的时钟。

在CW32提供的库函数中找到cw32f003_rcc.h,这个头文件包含了所有时钟相关的函数接口。外设时钟的接口如下图所示:

LED驱动

图2-7 GPIO配置相关函数

LED1的控制IO是PC0,因此需要打开GPIOC对应的时钟,代码如下:

 

__RCC_GPIOC_CLK_ENABLE();//打开GPIOC的时钟
2.3.1.3.配置GPIO初始化

GPIO初始化包含了模式,中断使能,io引脚位号。CW32的GPIO初始化是先把所有初始化项写在一个结构体里面,然后把结构体传入带初始化函数里,完成初始化功能。

与GPIO相关的函数接口都在cw32f003_gpio.h头文件里面,我们先看GPIO模式有哪些,如下图所示:

LED驱动

  图2-8 GPIO模式 GPIO模式包含了模拟输入,数字输入,数字上拉输入,数字下拉输入,数字推挽输出,数字开漏输出模式。

根据发光二极管控制原理,PC0接在LED的反向端,因此PC0为低电平时,LED点亮。我们需要PC0输出高低电平,模式需要选择数字输出模式,由于开漏模式需要外部有上拉或者下拉电阻才可输出高低电平,所以我们选择推挽模式。代码如下:

 GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP;
中断使能包含了:无中断,上升沿,下降沿,低电平,高电平中断使能。

LED驱动

图2-9 GPIO中断 因为我们需要的是GPIO输出,因此不需要中断使能,代码如下:

 GPIO_Init_Struct.IT = GPIO_IT_NONE;
GPIO位号如下图所示:

LED驱动

图2-10 GPIO位脚 LED的控制端为PC0,最后的这个0就是位号,配置代码如下:

 GPIO_Init_Struct.Pins = GPIO_PIN_0;
引脚输出还需要配置GPIO的输出速度,有高低速两种速度设置,我们设置高速:
GPIO_Init_Struct.Speed = GPIO_SPEED_HIGH;
以上配置就完成了GPIO的结构体初始化,然后我们需要调用初始化函数,在cw32f003_rcc.h里找到void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);包含了两个参数,第一个参数是GPIO的基地址,第二个参数是初始化配置结构体。调用代码如下:
GPIO_Init(CW_GPIOC, &GPIO_Init_Struct);
结合以上配置,完整代码如下:
 GPIO_InitTypeDef GPIO_Init_Struct;
  __RCC_GPIOC_CLK_ENABLE();
  GPIO_Init_Struct.IT   = GPIO_IT_NONE;
  GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_Init_Struct.Pins = GPIO_PIN_0;
  GPIO_Init(CW_GPIOC, &GPIO_Init_Struct);
2.3.1.4.配置LED输出

配置好GPIO之后,就可以进行点灯了。就是让PC0输出高低电平。 在cw32f003_gpio.h头文件中可以找到函数
GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState);

传参有三个,第一个是第一个参数是GPIO的基地址,第二个参数是引脚位号,第三个参数是输出状态。
GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_SET);//PC0输出高电平
GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_RESET);//PC0输出低电平
我们要点亮LED1根据上文的电路图可知要将PC0置低。

2.3.1.5.程序下载接线

我们使用DAP-Link作为程序下载媒介,DAP-Link的接线图如下。其中蓝色(3.3V)、绿色(GND)、 紫色(数据线SWD)、灰色(时钟信号线SCK),与图2-12一一对应。

LED驱动

图2-11 DAP-Link接线图

LED驱动

图2-12 CW32F003程序下载接线

2.3.2.实验效果

最终的实验效果如下图所示:

LED驱动

图2-13 LED点亮实验现象



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分