找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2632|回復: 0
收起左側

dspf2812實現電機檢測霍爾傳感器程序,實現自動加速和正反轉

[復制鏈接]
ID:828888 發(fā)表于 2022-4-20 23:44 | 顯示全部樓層 |閱讀模式
dspf2812實現電機檢測霍爾傳感器,實現自動加速和正反轉
HW1_2019217472_P1.jpg HW1_2019217472_P2.jpg

  1. #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
  2. #include "DSP281x_Examples.h"   // DSP281x Examples Include File
  3. //GPIOA的宏定義
  4. //GPIO0-5輸出模式  123
  5. #define          PA0        GpioDataRegs.GPADAT.bit.GPIOA0
  6. #define          PA1        GpioDataRegs.GPADAT.bit.GPIOA1
  7. #define          PA2        GpioDataRegs.GPADAT.bit.GPIOA2
  8. #define          PA3        GpioDataRegs.GPADAT.bit.GPIOA3
  9. #define          PA4        GpioDataRegs.GPADAT.bit.GPIOA4
  10. #define          PA5        GpioDataRegs.GPADAT.bit.GPIOA5
  11. //GPIO8-10輸入模式
  12. #define          PA8   GpioDataRegs.GPADAT.bit.GPIOA8
  13. #define          PA9   GpioDataRegs.GPADAT.bit.GPIOA9
  14. #define          PA10  GpioDataRegs.GPADAT.bit.GPIOA10

  15. //函數聲明
  16. interrupt void cpu_timer0_isr(void);  //中斷函數的聲明
  17. void gpio_init();                //GPIO配置函數聲明
  18. void fuzhi(int a,int b,int c,int d,int e,int f);  //給GPIOA0-5賦值函數聲明
  19. void  mode(int a);          //狀態(tài)選擇和GPIOA8-10讀取輸出

  20. int  driver_state=1;  //中斷查詢確定在狀態(tài)多少,driver_state取值1-6個狀態(tài)
  21. int  rotor_code;  //存放GPIOA8-10的輸出狀態(tài)

  22. void main(void)  //主函數
  23. {
  24.    InitSysCtrl();//初始化系統(tǒng)
  25.    gpio_init();  //GPIOA初始化
  26.    DINT;                         //關中斷
  27.    IER = 0x0000;
  28.    IFR = 0x0000;
  29.    InitPieCtrl();//初始化PIE
  30.    InitPieVectTable();//初始化PIE中斷矢量表
  31.    EALLOW;  
  32.    PieVectTable.TINT0 = & cpu_timer0_isr;  //定時器0位中斷0
  33.    EDIS;
  34.    InitCpuTimers();   // cpu初始化
  35.    //定時器0的中斷時間設置 150*1000000/150MHZ=1s
  36.    ConfigCpuTimer(&CpuTimer0, 150, 1000000);
  37.    StartCpuTimer0();          //啟動定時器0
  38.    IER |= M_INT1;                  //啟動cpu給定時器時鐘
  39.    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 中斷0在向量表中的1組第7個
  40.    EINT;   // 總中斷 INTM 使能
  41.    ERTM;   // 使能總實時中斷 DBGM
  42.    for(;;);  //一直等待中斷來
  43. }
  44. interrupt void cpu_timer0_isr(void)   //中斷服務函數
  45. {       
  46.         PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001賦給12組中斷ACKnowledge寄存器,對其全部清除,不接受其他中斷
  47.         CpuTimer0Regs.TCR.bit.TIF=1; // 定時到了指定時間,標志位置位,清除標志
  48.         CpuTimer0Regs.TCR.bit.TRB=1;  // 重載Timer0的定時數據
  49.         if(driver_state >= 6)
  50.                 driver_state=0;   //狀態(tài)達到最大值6后復位0
  51.         mode(driver_state);   //根據狀態(tài)值,選擇模式
  52.         driver_state++;
  53. }
  54. //模式選擇和讀取GPIO8-10的值
  55. void  mode(int a)   //給 GPIOA 0 2 4 1 3 5賦值
  56. {
  57.         switch(a)
  58.                 {
  59.                         case 1:
  60.                                 fuzhi(1,0,0,1,1,0);  //1,0,0,1,1,0
  61.                                 break;  //狀態(tài)1
  62.                         case 2:
  63.                                 fuzhi(1,0,0,1,0,1);  //1,0,0,1,0,1
  64.                                 break;        //狀態(tài)2
  65.                         case 3:
  66.                                 fuzhi(0,1,0,0,1,1);  //0,1,0,0,1,1
  67.                                 break;        //狀態(tài)3
  68.                         case 4:
  69.                                 fuzhi(0,1,0,1,1,0); //0,1,0,1,1,0
  70.                                 break;        //狀態(tài)4
  71.                         case 5:
  72.                                 fuzhi(0,0,1,1,0,1);  //0,0,1,1,0,1
  73.                                 break;        //狀態(tài)5
  74.                         case 6:
  75.                                 fuzhi(0,0,1,0,1,1);  //0,0,1,0,1,1
  76.                                 break;        //轉態(tài)6
  77.                         default:
  78.                                 fuzhi(1,0,0,1,1,0);//1,0,0,1,1,0
  79.                                 break;                //默認狀態(tài)1
  80.                 }
  81.         //為了求取rotor_code的值,把GPIOA8-10設置有權重
  82.         int sum=PA10*4+PA9*2+PA8*1;
  83.         if(sum==0)
  84.                 rotor_code=0;
  85.         if(sum==1)
  86.                 rotor_code=1;
  87.         if(sum==2)
  88.                 rotor_code=10;
  89.         if(sum==3)
  90.                 rotor_code=11;
  91.         if(sum==4)
  92.                 rotor_code=100;
  93.         if(sum==5)
  94.                 rotor_code=101;
  95.         if(sum==6)
  96.                 rotor_code=110;
  97.         if(sum==7)
  98.                 rotor_code=111;
  99. }
  100. //給GPIOA0-5賦值
  101. void fuzhi(int a,int b,int c,int d,int e,int f)
  102. {
  103.         PA0=a;
  104.         PA2=b;
  105.         PA4=c;
  106.         PA1=d;
  107.         PA3=e;
  108.         PA5=f;
  109. }
  110. //GPIOA的端口模式選擇
  111. void gpio_init()
  112. {//設置GPIOA0-5是輸出模式   GPIOA8-10是輸入模式
  113.   EALLOW;
  114.   GpioMuxRegs.GPADIR.bit.GPIOA0 = 1;  // GPIOA0設置為輸出
  115.   GpioMuxRegs.GPADIR.bit.GPIOA1 = 1;
  116.   GpioMuxRegs.GPADIR.bit.GPIOA2 = 1;
  117.   GpioMuxRegs.GPADIR.bit.GPIOA3 = 1;
  118.   GpioMuxRegs.GPADIR.bit.GPIOA4 = 1;
  119.   GpioMuxRegs.GPADIR.bit.GPIOA5 = 1;// GPIOA5設置為輸出


  120.   GpioMuxRegs.GPADIR.bit.GPIOA8 = 0;  //GPIOA8設置為輸入
  121.   GpioMuxRegs.GPADIR.bit.GPIOA9 = 0;  //  設置為輸入
  122.   GpioMuxRegs.GPADIR.bit.GPIOA10 = 0;  // GPIOA10 設置為輸入

  123. }

  124. //===========================================================================
  125. // No more.
  126. //===========================================================================
復制代碼


HW1_2019217472_P1.rar

317.63 KB, 下載次數: 14, 下載積分: 黑幣 -5

HW1_2019217472_P2.rar

317.92 KB, 下載次數: 11, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表