找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1681|回复: 0
打印 上一主题 下一主题
收起左侧

dspf2812实现电机检测霍尔传感器程序,实现自动加速和正反转

[复制链接]
跳转到指定楼层
楼主
dspf2812实现电机检测霍尔传感器,实现自动加速和正反转


  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);          //状态选择和GPIOA8-10读取输出

  20. int  driver_state=1;  //中断查询确定在状态多少,driver_state取值1-6个状态
  21. int  rotor_code;  //存放GPIOA8-10的输出状态

  22. void main(void)  //主函数
  23. {
  24.    InitSysCtrl();//初始化系统
  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;   //状态达到最大值6后复位0
  51.         mode(driver_state);   //根据状态值,选择模式
  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;  //状态1
  62.                         case 2:
  63.                                 fuzhi(1,0,0,1,0,1);  //1,0,0,1,0,1
  64.                                 break;        //状态2
  65.                         case 3:
  66.                                 fuzhi(0,1,0,0,1,1);  //0,1,0,0,1,1
  67.                                 break;        //状态3
  68.                         case 4:
  69.                                 fuzhi(0,1,0,1,1,0); //0,1,0,1,1,0
  70.                                 break;        //状态4
  71.                         case 5:
  72.                                 fuzhi(0,0,1,1,0,1);  //0,0,1,1,0,1
  73.                                 break;        //状态5
  74.                         case 6:
  75.                                 fuzhi(0,0,1,0,1,1);  //0,0,1,0,1,1
  76.                                 break;        //转态6
  77.                         default:
  78.                                 fuzhi(1,0,0,1,1,0);//1,0,0,1,1,0
  79.                                 break;                //默认状态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, 下载次数: 12, 下载积分: 黑币 -5

HW1_2019217472_P2.rar

317.92 KB, 下载次数: 10, 下载积分: 黑币 -5

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表