久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3383|回復: 2
打印 上一主題 下一主題
收起左側

基于SM32的脈沖輸出定位控制程序 平衡車的相關文件

[復制鏈接]
跳轉到指定樓層
樓主
給大家分享一些平衡車的相關文件,
基于SM32的脈沖輸出定位控制


所有資料51hei提供下載:
基于SM32的脈沖輸出定位控制.rar (276.16 KB, 下載次數: 21)



TIMER2_PWM_005單片機源程序如下(stm32芯片):


  1. /*簡易運動控制器*/
  2. /*脈沖+方向控制步進伺服電機*/
  3. /*由PORTA.0口輸出占空比為50%的脈沖*/
  4. /*GPIOA.0為脈沖輸出*/
  5. /*GPIOB.5為方向輸出*/
  6. /*DRVI(A,B);相對定位,以B的頻率輸出A(A取絕對值)個脈沖A不能為0,若A為正數,方向GPIOB.5為高電平;反之,負數,低電平*/
  7. /*DRVA(A,B);絕對定位,以B的頻率輸出脈沖,運行至A個脈沖的位置*/



  8. #include "stm32reg.h"
  9. #include "system_stm32.h"
  10. long mubiao;//有符號方向
  11. long dangqian;//有符號方向
  12. STATUS_Type run;

  13. void MyTimer2_Init()
  14. {
  15.         RSTCLKCTRL->APB2CLKEN|=(1<<2)|(1<<0);//使能AFIO、GPIOA時鐘
  16.         GPIOA->CONFG[0]&=0xfffffff0;
  17.         GPIOA->CONFG[0]|=0x0000000a;         //配置PORTA.0為復用推挽輸出,輸出最大頻率2MHz
  18.         
  19.         RSTCLKCTRL->APB1CLKEN|=1;            //使能定時器TIMER2時鐘
  20.         TIMER2->PRESC=64-1;                  //設置定時器2預分頻值,使定時器得到1MHz的計數頻率
  21.         TIMER2->CONTROL1|=1<<2;              //設置只有計數溢出作為更新中斷
  22.         TIMER2->DMAINTEN|=1<<0;              //允許定時器2計數溢出中斷
  23.         
  24.         Interrupt_Priority(28,0,2,group_2);  //使能第28號中斷(即定時器2全局中斷),搶占0響應2,中斷分組2
  25.         
  26.         TIMER2->CAPCMPMOD1&=~(3<<0);         //CC1通道配置為輸出模式
  27.         TIMER2->CAPCMPMOD1|=7<<4;            //輸出比較1為PWM模式2
  28.         TIMER2->CAPCMPEN|=1<<0;              //通道1輸出使能
  29.         
  30. }

  31. void Timer2_Startup(u16 frequency)       //啟動定時器2
  32. {
  33.         if(frequency<20)  frequency=20;      //最小頻率設定為20,因為頻率設定過小,得到的重裝值會超出16位
  34.         TIMER2->RELOAD=1000000/frequency-1;  //設定重裝值
  35.         TIMER2->CAPCMP1=TIMER2->RELOAD>>1;   //匹配值1等于重裝值一半,是以占空比為50%
  36.         MyDelay(10,ms);                      //脈沖信號比方向信號滯后,以提高可靠性
  37.         TIMER2->CONTROL1|=1<<0;              //啟動定時器TIMER2計數
  38. }

  39. void DRVI(long num,u16 frequency)        //相對定位函數
  40. {
  41.         if(num>0)
  42.         {
  43.                 GPIOB->BITSETRST=1<<5;
  44.         }
  45.         else if(num<0)
  46.         {
  47.                 GPIOB->BITRST=1<<5;
  48.         }
  49.         mubiao=dangqian+num;

  50.         Timer2_Startup(frequency);
  51. }

  52. void DRVA(long num,u16 frequency)         //絕對定位函數
  53. {
  54.         mubiao=num;
  55.         if(mubiao==dangqian)
  56.         {
  57.                 run=OFF;
  58.         }
  59.         else
  60.         {
  61.                 if(mubiao>dangqian)
  62.                 {
  63.                         GPIOB->BITSETRST=1<<5;
  64.                 }
  65.                 else
  66.                 {
  67.                         GPIOB->BITRST=1<<5;
  68.                 }
  69.                 Timer2_Startup(frequency);
  70.         }
  71. }



  72. void TIM2_IRQHandler()                    //定時器2全局中斷函數
  73. {
  74.         if(TIMER2->STATUS&0x0001)
  75.         {
  76.                 if(GPIOB->OUTDATA&(1<<5))         //如果方向為正   
  77.                 {
  78.                         dangqian++;
  79.                 }
  80.                 else                              //否則方向為負
  81.                 {
  82.                         dangqian--;
  83.                 }
  84.                 if(dangqian==mubiao)              //計數溢出次數、也即輸出的脈沖個數達到目標值
  85.                 {
  86.                         TIMER2->CONTROL1&=~(1<<0);          //停止定時器2計數、也即停止脈沖輸出
  87.                         run=OFF;                      //復位脈沖定位指令執行標志
  88.                 }
  89.                 TIMER2->STATUS=0x0000;
  90.         }
  91. }




  92. int main(void)
  93. {
  94.         u32 tp,tp1;
  95.         mubiao=0;//目標位置脈沖值
  96.         dangqian=0;//當前位置脈沖值
  97.         run=OFF;//脈沖定位指令執行標志
  98.         
  99.         System_Init();
  100.         
  101.         RSTCLKCTRL->APB2CLKEN|=(1<<3)|(1<<6);//使能GPIOB、GPIOE時鐘
  102.         
  103.         GPIOB->CONFG[0]&=0xff0fffff;
  104.         GPIOB->CONFG[0]|=0x00300000;//GPIOB.5配置為推挽輸出,作為脈沖的方向信號輸出
  105.         GPIOB->BITRST=1<<5;
  106.         
  107.         GPIOE->CONFG[0]&=0xfff00000;
  108.         GPIOE->CONFG[0]|=0x00088888;//GPIOE.0/1/2/3/4配置為上下拉輸入,作為按鍵
  109.         GPIOE->BITRST=0x001f;
  110.         
  111.         Interrupt_Group(group_2);//中斷分組,只要一次
  112.         MyTimer2_Init();//定時器2初始化
  113.         
  114.         while(1)
  115.         {
  116.                 tp=GPIOE->INDATA;//讀取按鍵輸入
  117.                 if(tp&0x001f)
  118.                 {
  119.                         MyDelay(10,ms);//延時消抖,輸入濾波
  120.                         tp1=GPIOE->INDATA;//再次讀取按鍵輸入
  121.                         if((tp&0x001f)&&(tp==tp1))//確實有按鍵輸入,且兩次讀取的值一致
  122.                         {
  123.                                 if(run==OFF)//如果此時正在發生脈沖輸出,不接受新命令,
  124.                                 {
  125.                                         run=ON;//置位脈沖定位指令執行標志
  126.                                         switch(tp&0x001f)
  127.                                         {
  128.                                                 case 0x0001:DRVI(20,20);break;//按下按鍵PE0,前進20脈沖        
  129.                                                 case 0x0002:DRVI(-25,33);break;//按下按鍵PE1,后退25脈沖                                                        
  130.                                                 case 0x0004:DRVA(0,50);break;//按下按鍵PE2,回零點
  131.                                                 case 0x0008:DRVA(15,25);break;//按下按鍵PE3,運動到絕對位置15脈沖處                                                        
  132.                                                 case 0x0010:DRVA(-5,40);break;//按下按鍵PE4,運動到絕對位置-5脈沖處
  133.                                         }
  134.                                 }
  135.                         }
  136.                 }
  137.         }
  138. }
復制代碼



  1. /*由PORTA.0口輸出占空比為50%的脈沖,脈沖數量無限,脈沖頻率指定*/
  2. #include "stm32reg.h"
  3. #include "system_stm32.h"
  4. void MyTimer2_Init()
  5. {
  6.         RSTCLKCTRL->APB2CLKEN|=(1<<2)|(1<<0);//使能AFIO、GPIOA時鐘
  7.         GPIOA->CONFG[0]&=0xfffffff0;
  8.         GPIOA->CONFG[0]|=0x0000000a;         //配置PORTA.0為復用推挽輸出,輸出最大頻率2MHz
  9.         
  10.         RSTCLKCTRL->APB1CLKEN|=1;            //使能定時器TIMER2時鐘
  11.         TIMER2->PRESC=64-1;                 //設置定時器2預分頻值,使定時器得到1MHz的計數頻率
  12.         
  13.         TIMER2->CAPCMPMOD1&=~(3<<0);         //CC1通道配置為輸出模式
  14.         TIMER2->CAPCMPMOD1|=7<<4;            //輸出比較1為PWM模式2
  15.         TIMER2->CAPCMPEN|=1<<0;              //通道1輸出使能
  16.         
  17. }

  18. void MyTimer2_Startup(u16 frequency)
  19. {
  20.         if(frequency<20)  frequency=20;
  21.         TIMER2->RELOAD=1000000/frequency-1;
  22.         TIMER2->CAPCMP1=TIMER2->RELOAD>>1;
  23.         TIMER2->CONTROL1|=1<<0;              //啟動定時器TIMER2計數
  24. }




  25. void TIM2_IRQHandler()
  26. {
  27.         
  28. }




  29. int main(void)
  30. {
  31.         System_Init();
  32.         
  33.         RSTCLKCTRL->APB2CLKEN|=1<<3;
  34.         
  35.         GPIOB->CONFG[0]&=0xff0fffff;
  36.         GPIOB->CONFG[0]|=0x00300000;
  37.         GPIOB->BITRST=1<<5;
  38.         
  39.         //Interrupt_Group(group_2);//本例沒有使用中斷,不需要分組
  40.         MyTimer2_Init();
  41.         MyTimer2_Startup(33);
  42.         
  43.         while(1)
  44.         {
  45.                 GPIOB->BITRST=1<<5;
  46.                 MyDelay(100,ms);
  47.                 GPIOB->BITSETRST=1<<5;
  48.                 MyDelay(100,ms);
  49.         }
  50. }

復制代碼







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:396515 發表于 2019-9-23 20:40 | 只看該作者
剛好需要這方面資料,謝謝分享!
回復

使用道具 舉報

板凳
ID:358547 發表于 2019-9-25 09:29 | 只看該作者
學習一下!謝謝!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚州春色| 亚洲欧美激情四射 | 亚洲男人天堂2024 | 男女那个视频 | 欧美日韩黄色一级片 | 高清国产午夜精品久久久久久 | 日韩福利在线 | 婷婷久| 91精品国产综合久久精品 | 神马福利| 美日韩免费视频 | 国产人免费人成免费视频 | 国产精品视频在线观看 | 久草视频在线播放 | 夜夜操操操| 成人亚洲精品久久久久软件 | 毛片区| 天堂一区二区三区 | 国产精品一区二区在线免费观看 | 日日噜噜夜夜爽爽狠狠 | 国产一级片在线观看视频 | 91精品国产综合久久婷婷香蕉 | 日韩一区二区三区视频 | 精品久久国产视频 | 成人精品鲁一区一区二区 | 久久精品久久久 | 国产精品一区三区 | 色花av| 亚洲欧美中文日韩在线v日本 | 精品乱码一区二区三四区视频 | 日韩电影一区二区三区 | 91看片在线观看 | 精品国产区 | 久久久久久久久久久91 | 高清一区二区三区 | 干狠狠 | 视频一区二区在线 | 国产精品视频久久 | 日韩三级一区 | 国产视频一区二区三区四区五区 | 国产三级日本三级 |