0 前言
前些時間實在忙於實驗室寫論文和做實驗,許久沒有更新。近期經常有一些同學問到,有沒有永磁同步電機系列的實驗教程???
考慮到做電機控制基本都需要用到DSP編程,對DSP不瞭解的同學直接上手電機控制會很困難。於是,決定在此之前應該做個DSP28335系列基礎教程。
新系列DSP28335基礎教程分爲以下幾期來講:
(一)GPIO輸出(流水燈實驗)
(二)GPIO輸入(矩陣按鍵掃描)
(三)系統定時器CPUTimer(定時中斷)
(四)SCI串口通信實驗(上位機收發顯示)
(五)外部中斷控制(按鍵觸發)
(六)SPI通信實驗(LCD12864顯示控制)
(七)I2C通信實驗(OLED顯示控制)
(八)DMA與ADC轉換(外部電壓採集)
(九)EPWM實驗(呼吸燈控制)
(十)ECAP實驗(超聲波測距)
(十一)EQEP實驗(直流電機轉速檢測)
(十二)ECAN實驗(上位機收發顯示控制)
內容還是相當多,搞懂這些基本外設,之後在做電機控制與之前理論仿真算法結合一起,基本是無壓力了。
爲了做這些教程,自己已經設計了一款dsp28335核心板,在之後都會基於此核心板和相關外設,並結合底層硬件原理講解DSP代碼。(核心板先目睹爲快,需要的可自行上“某寶”搜索)
目錄
1. 硬件及控制原理
2. DSP代碼介紹
3. 實驗結果
4. 結論
1 硬件及控制原理
如圖所示,在覈心板中,LED是共陽極的,陰極分別接到GPIO0~GPIO4。當對應的IO口輸出低電平時,LED亮燈,高電平時,LED滅燈。要使LED以流水燈的形式工作,則應依次控制IO口電平反轉兩次(兩次反轉之間加延遲)。
2 DSP代碼介紹
看代碼前,先看看工作流程圖。由於28335寄存器太多了,大家可以參考數據手冊的寄存器說明,代碼部分也有註釋(注意:查看代碼時雙擊點進去看,否則會內容不全)。
/**
* ********************************************************************************************
* @file main.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED流水燈測試
* *******************************************************************************************
* @attention
* 實驗平臺:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘寶:https://shop409670932.taobao.com
*/
#include "DSP28x_Project.h"
#include "bsp_led.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
void delay_1ms(Uint16 t);
/**
* @brief 主函數
* @parameter 無
* @return_value 無
*/
void main(void)
{
/*第一步:初始化系統控制:*/
InitSysCtrl();
/*第二步:初始化GPIO口*/
InitGpio();
/* 第三步:清除所有中斷 和初始化 PIE 向量表:*/
DINT;// 禁用CPU中斷
InitPieCtrl();// 初始化 PIE 控制寄存器到默認狀態,默認狀態是全部 PIE 中斷被禁用和標誌位被清除
IER = 0x0000;// 禁用 CPU 中斷和清除所有 CPU 中斷標誌位:
IFR = 0x0000;
InitPieVectTable();// 初始化 PIE 中斷向量表
// 中斷重映射,註冊中斷程序入口(用戶按需求添加)
//
/*程序燒錄入28335(可選的)*/
#if RUN_TYPE==FLASH_RUN
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
#endif
/* 第四步: 初始化片上外設*/
// InitPeripherals(); //初始化所有外設(本例程不需要)
/* 第五步:添加用戶功能具體代碼*/
LED_GPIO_Config();//LED端口初始化
/*第六步:進入主循環*/
for(;;)
{
LED0(1);
delay_1ms(1000);
LED0(0);
LED1(1);
delay_1ms(1000);
LED1(0);
LED2(1);
delay_1ms(1000);
LED2(0);
LED3(1);
delay_1ms(1000);
LED3(0);
LED4(1);
delay_1ms(1000);
LED4(0);
}
}
/**
* @brief 1ms延遲函數
* @parameter t
* @return_value 無
*/
void delay_1ms(Uint16 t)
{
while(t--)
{
DELAY_US(1000);
}
}
/**
* ********************************************************************************************
* @file bsp.led.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED應用函數接口
* *******************************************************************************************
* @attention
* 實驗平臺:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘寶:https://shop409670932.taobao.com
*/
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能內部上拉
GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成輸出
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能內部上拉
GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成輸出
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能內部上拉
GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成輸出
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能內部上拉
GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成輸出
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能內部上拉
GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成輸出
GpioDataRegs. GPASET.bit.GPIO0=1;
GpioDataRegs. GPASET.bit.GPIO1=1;
GpioDataRegs. GPASET.bit.GPIO2=1;
GpioDataRegs. GPASET.bit.GPIO3=1;
GpioDataRegs. GPASET.bit.GPIO4=1;
EDIS;
}
/**
* ********************************************************************************************
* @file bsp_led.h
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED應用函數接口頭文件
* *******************************************************************************************
* @attention
* 實驗平臺:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘寶:https://shop409670932.taobao.com
*/
#ifndef _BSP_LED_H_
#define _BSP_LED_H_
#include "DSP28x_Project.h"
/* 宏帶參,可以像內聯函數一樣使用,低電平亮燈*/
#define LED0(a) if (a) \
GpioDataRegs. GPACLEAR.bit.GPIO0=1;\
else \
GpioDataRegs. GPASET.bit.GPIO0=1
#define LED1(a) if (a) \
GpioDataRegs. GPACLEAR.bit.GPIO1=1;\
else \
GpioDataRegs. GPASET.bit.GPIO1=1
#define LED2(a) if (a) \
GpioDataRegs. GPACLEAR.bit.GPIO2=1;\
else \
GpioDataRegs. GPASET.bit.GPIO2=1
#define LED3(a) if (a) \
GpioDataRegs. GPACLEAR.bit.GPIO3=1;\
else \
GpioDataRegs. GPASET.bit.GPIO3=1
#define LED4(a) if (a) \
GpioDataRegs. GPACLEAR.bit.GPIO4=1;\
else \
GpioDataRegs. GPASET.bit.GPIO4=1
/*定義IO口的宏*/
#define LED0_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO0=1
#define LED0_OFF GpioDataRegs. GPASET.bit.GPIO0=1
#define LED0_ON GpioDataRegs. GPACLEAR.bit.GPIO0=1
#define LED1_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO1=1
#define LED1_OFF GpioDataRegs. GPASET.bit.GPIO1=1
#define LED1_ON GpioDataRegs. GPACLEAR.bit.GPIO1=1
#define LED2_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO2=1
#define LED2_OFF GpioDataRegs. GPASET.bit.GPIO2=1
#define LED2_ON GpioDataRegs. GPACLEAR.bit.GPIO2=1
#define LED3_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO3=1
#define LED3_OFF GpioDataRegs. GPASET.bit.GPIO3=1
#define LED3_ON GpioDataRegs. GPACLEAR.bit.GPIO3=1
#define LED4_TOGGLE GpioDataRegs. GPATOGGLE.bit.GPIO4=1
#define LED4_OFF GpioDataRegs. GPASET.bit.GPIO4=1
#define LED4_ON GpioDataRegs. GPACLEAR.bit.GPIO4=1
void LED_GPIO_Config(void);
#endif /*_BSP_LED_H_ */
3 實驗結果
實驗設備:核心板
使用XDS100V3仿真器接到JTAG接口,並在工程中配置選擇好對應的仿真器。
點擊燒錄按鍵後,可以看到LED0~4流水燈現象。
4 結論
本期重點就是掌握GPIO口輸出寄存器的配置,這是非常重要又基礎的功能,在今後的基礎教程中都會用到。
大家可以參考代碼嘗試一下,看能否編出花樣流水燈哈~ 有疑問的歡迎留言!!