DSP28335学习笔记(2)

实验

点亮LED灯

  • 电路设计

    共阳极连接

image-20240502144941538

  • 软件设计

    1. 让 F28335 的 GPIO68 管 脚输出一个低电平。
    2. 使能对应 IO 外设时钟、配置 IO功能和输出模式,上拉设置。

    主要程序:

    //LED初始化函数
    void LED_Init(void)
    {
        EALLOW;//关闭写保护
        SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // 开启GPIO时钟
    
        //LED1端口配置
        GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
        GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
        GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
    
        GpioDataRegs.GPCSET.bit.GPIO68=1;//设置GPIO输出高电平
    
        EDIS;//开启写保护
    }
    //延时函数
    void delay(void)
    {
        Uint16      i;
        Uint32      j;
        for(i=0;i<32;i++)
            for (j = 0; j < 100000; j++);
    }
    
    //主函数
    void main()
    {
        InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟
    
        LED_Init();
    //  GpioDataRegs.GPCCLEAR.bit.GPIO68  = 1;
    
        while(1)
        {
            GpioDataRegs.GPCTOGGLE.bit.GPIO68=1;//设置GPIO输出翻转信号
            delay();
        }
    }
    

蜂鸣器实验

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

压电式蜂鸣器(无源蜂鸣器)主要由多谐振荡器、 压电蜂鸣片、 阻抗匹配器及共鸣箱、外壳等组成。需要接通电源(1.5~15V 直 流工作电压),多谐振荡器起振,并输出 1.5~5kHZ 的音频信号,阻抗匹配器推 动压电蜂鸣片发声。

电磁式蜂鸣器(有源蜂鸣器)由振荡器、 电磁线圈、 磁铁、 振动膜片及外壳等组成。接 通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

  • 硬件电路

    image-20240503140025667

无源蜂鸣器的控制需要给其一定频率的脉冲才能发声, 仅给一个高电平或者低电平是不能发声的,因此蜂鸣器模块电路直接将 F28335 引 脚接在 ULN2003 驱动芯片的输入口上,对应通道的输出连接蜂鸣器。

  • 软件设计

    F28335 的 GPIO6 管脚输出一定频率的脉冲信号。即间隔一定时间翻转 GPIO6 输出电平状态。

    //蜂鸣器初始化
    void Beep_init()
    {
        EALLOW;//关闭写保护
        SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // 开启GPIO时钟
        //LED1端口配置
        GpioCtrlRegs.GPAMUX1.bit.GPIO6=0;//设置为通用GPIO功能
        GpioCtrlRegs.GPADIR.bit.GPIO6=1;//设置GPIO方向为输出
        GpioCtrlRegs.GPAPUD.bit.GPIO6=0;//使能GPIO上拉电阻
    
        GpioDataRegs.GPASET.bit.GPIO6=1;//设置GPIO输出高电平
    
        EDIS;//开启写保护
    }
    //主程序
    void main()
    {
       int i = 0;
        InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟
        LED_Init();
        Beep_init();
    
        while(1)
        {
            i++;
            if(i%1000==0)
            {
                i = 0;
                LED1_TOGGLE;
            }
    
           BEEP_TOGGLE;//设置GPIO06输出翻转信号
            DELAY_US(100);
        }
    }
    

继电器实验

电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。

  • 硬件设计

image-20240504133332536

  • 软件设计

    1. 让 F28335 的 GPIO15 管脚输出高电平。

    2. 初始化继电器控制 IO 口(使能对应 IO 外设时钟、配置 IO 为普通 IO 功能和输出模式、上拉设置等)。

      //宏定义
      #define RELAY_ON			(GpioDataRegs.GPASET.bit.GPIO15=1)
      #define RELAY_OFF			(GpioDataRegs.GPACLEAR.bit.GPIO15=1)
      //初始化程序
      void Relay_Init(void)
      {
      	EALLOW;
      	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
      
      	//继电器端口配置
      	GpioCtrlRegs.GPAMUX1.bit.GPIO15=0;
      	GpioCtrlRegs.GPADIR.bit.GPIO15=1;
      	GpioCtrlRegs.GPAPUD.bit.GPIO15=0;
      
      	EDIS;
      
      	GpioDataRegs.GPACLEAR.bit.GPIO15=1;
      }
      //主程序
      void main()
      {
      	int i=0;
      
      	InitSysCtrl();
      
      	LED_Init();
      	Relay_Init();
      	RELAY_ON;
      	while(1)
      	{
      		i++;
      		if(i%200==0)
      		{
      			LED1_TOGGLE;
      		}
      		DELAY_US(1000);
      	}
      }
      

矩阵按键控制实验

键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。

由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时 也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间 的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长 短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起按 键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。

image-20240504145524200

按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖

  • 软件消抖(延时)

    先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。

  • 硬件消抖

    在这里插入图片描述

    利用电容的放电延时,采用并联电容法,也可以实现硬件消抖。由于电容两端电压不能突变,使得按键两端的电压平缓变化,直至电容充放电到达一定电压阈值时,单片机才读取到电平变化。

    按键按下(高电平->低电平):按键按下,电容与按键形成回路,电容开始放电,当电容放电结束后,抖动就基本结束了。在放电期间,KeyIn1处一直向外输出高电平。

    按键松开(低电平->高电平):按键松开,电容左极板接电源,右极板接地,开始充电,当电容充电结束后,抖动也就基本结束了。在电容充电期间,KeyIn1处一直向外输出为低电平。

  • 矩阵按键工作原理

无论是独立键盘还是矩阵键盘, 单片机检测其是否被按下的依据都是一样 的, 也就是检测与该键对应的 I/O 口是否为低电平。

  • 检测方法

行列扫描法:先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。

线翻转法:使所有行线为低电平时,检测所有列线是否有低电平,如果 有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部 按键。

  • 硬件设计

image-20240504151542288

  • 软件设计

    (1)初始化按键 IO 口(使能对应 IO 外设时钟、配置 IO 为普通 IO 功能和 输出模式、上拉设置等)

    (2)按键检测程序

    (3)按键控制程序

    key.h

#ifndef KEY_H_
#define KEY_H_


#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件


#define KEY_L1_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO48=1)
#define KEY_L2_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO49=1)
#define KEY_L3_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO50=1)

#define KEY_L1_SetH			(GpioDataRegs.GPBSET.bit.GPIO48=1)
#define KEY_L2_SetH			(GpioDataRegs.GPBSET.bit.GPIO49=1)
#define KEY_L3_SetH			(GpioDataRegs.GPBSET.bit.GPIO50=1)

#define KEY_H1			(GpioDataRegs.GPADAT.bit.GPIO12)
#define KEY_H2			(GpioDataRegs.GPADAT.bit.GPIO13)
#define KEY_H3			(GpioDataRegs.GPADAT.bit.GPIO14)

#define KEY1_PRESS		1
#define KEY2_PRESS		2
#define KEY3_PRESS		3
#define KEY4_PRESS		4
#define KEY5_PRESS		5
#define KEY6_PRESS		6
#define KEY7_PRESS		7
#define KEY8_PRESS		8
#define KEY9_PRESS		9
#define KEY_UNPRESS		0


void KEY_Init(void);
char KEY_Scan(char mode);

#endif /* KEY_H_ */

key.c

#include "key.h"

void KEY_Init(void)
{
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟

	//KEY端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
	GpioCtrlRegs.GPADIR.bit.GPIO12=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO12=0;

	GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
	GpioCtrlRegs.GPADIR.bit.GPIO13=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO13=0;

	GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
	GpioCtrlRegs.GPADIR.bit.GPIO14=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO14=0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO48=0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO49=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO49=0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO50=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO50=0;

	EDIS;

	GpioDataRegs.GPBSET.bit.GPIO48=1;
	GpioDataRegs.GPBSET.bit.GPIO49=1;
	GpioDataRegs.GPBSET.bit.GPIO50=1;

}

char KEY_Scan(char mode)
{

	static char keyl1=1;
	static char keyl2=1;
	static char keyl3=1;

	//第1列扫描
	KEY_L1_SetL;
	KEY_L2_SetH;
	KEY_L3_SetH;
	if(keyl1==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
	{
		DELAY_US(10000);//延时10us,消抖
		keyl1=0;
		if(KEY_H1==0)
		{
			return KEY1_PRESS;
		}
		else if(KEY_H2==0)
		{
			return KEY4_PRESS;
		}
		else if(KEY_H3==0)
		{
			return KEY7_PRESS;
		}
	}
	else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
	{
		keyl1=1;
	}
	if(mode)
		keyl1=1;


	//第2列扫描
	KEY_L2_SetL;
	KEY_L1_SetH;
	KEY_L3_SetH;
	if(keyl2==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
	{
		DELAY_US(10000);
		keyl2=0;
		if(KEY_H1==0)
		{
			return KEY2_PRESS;
		}
		else if(KEY_H2==0)
		{
			return KEY5_PRESS;
		}
		else if(KEY_H3==0)
		{
			return KEY8_PRESS;
		}
	}
	else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
	{
		keyl2=1;
	}
	if(mode)
		keyl2=1;


	//第3列扫描
	KEY_L3_SetL;
	KEY_L1_SetH;
	KEY_L2_SetH;
	if(keyl3==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
	{
		DELAY_US(10000);
		keyl3=0;
		if(KEY_H1==0)
		{
			return KEY3_PRESS;
		}
		else if(KEY_H2==0)
		{
			return KEY6_PRESS;
		}
		else if(KEY_H3==0)
		{
			return KEY9_PRESS;
		}
	}
	else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
	{
		keyl3=1;
	}
	if(mode)
		keyl3=1;

	return KEY_UNPRESS;
}

main.c

#include "DSP2833x_Device.h"    
#include "DSP2833x_Examples.h"  

#include "leds.h"
#include "key.h"

void main()
{
    int i=0;
    char key=0;

    InitSysCtrl();

    LED_Init();
    KEY_Init();

    while(1)
    {
        key=KEY_Scan(0);
        switch(key)
        {
            case KEY1_PRESS: LED2_TOGGLE;break;
            case KEY2_PRESS: LED3_TOGGLE;break;
            case KEY3_PRESS: LED4_TOGGLE;break;
            case KEY4_PRESS: LED5_TOGGLE;break;
            case KEY5_PRESS: LED6_TOGGLE;break;
            case KEY6_PRESS: LED7_TOGGLE;break;
        }

        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}
posted @ 2024-05-04 16:42  youngwuu  阅读(438)  评论(0编辑  收藏  举报