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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32電機閉環控制程序Orthogonal encoder

[復制鏈接]
跳轉到指定樓層
樓主
ID:453328 發表于 2019-4-17 15:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include "stm32f10x.h"

  2. //#include"delay.h"        //延時函數
  3. #include "usart.h"
  4. #include "pid.h"
  5. #include"pwm.h"
  6. #include "enc.h"
  7. #include "DataScope_DP.h"



  8. int pwm1,pwm2,pwm3; //PID計算后輸出的PWM占空比

  9. u8 flag=0;
  10. u16 Capture=0;
  11. u16 duty_TIM2=0;
  12. u8 RX_Command[1];

  13. extern PIDtypedef PID1,PID2,PID3;



  14. void USART_Configuration(void)
  15. {
  16.                 USART_InitTypeDef USART_InitStructure;
  17.                 GPIO_InitTypeDef GPIO_InitStructure;//定義結構體
  18.                 NVIC_InitTypeDef NVIC_InitStructure;
  19.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //使能A端口、端口復用時鐘

  20.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // PA.8        PA.8,作為捕獲輸入脈沖中斷的標志,進入中斷點亮LED燈
  21.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度
  22.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  23.                 GPIO_Init(GPIOA, &GPIO_InitStructure); //結構體初始化
  24.         
  25.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // PA.4  PA.4,作為定時器中斷的標志,20ms定時,進入中斷點亮LED燈
  26.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度
  27.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  28.                 GPIO_Init(GPIOA, &GPIO_InitStructure); //結構體初始化
  29.                 GPIO_SetBits(GPIOA,GPIO_Pin_4);

  30.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          //USART1 TX
  31.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //復用推挽輸出
  32.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  33.             GPIO_Init(GPIOA, &GPIO_InitStructure);      //A端口
  34.          
  35.             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;          //USART1 RX
  36.             GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //復用浮空輸入
  37.             GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  38.             GPIO_Init(GPIOA, &GPIO_InitStructure);           //A端口

  39.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  40.                          | GPIO_Pin_12 | GPIO_Pin_13; // PE.8         控制電機正反轉
  41.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度
  42.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  43.                 GPIO_Init(GPIOE, &GPIO_InitStructure); //結構體初始化

  44.                 GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_10 | GPIO_Pin_12); //置1
  45.                 GPIO_ResetBits(GPIOE,GPIO_Pin_9|GPIO_Pin_11 | GPIO_Pin_13);           //置0
  46.         
  47.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        //使能時鐘
  48.             USART_InitStructure.USART_BaudRate = 115200;                                //波特率設為9600
  49.                 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  50.                 USART_InitStructure.USART_StopBits = USART_StopBits_1;
  51.                 USART_InitStructure.USART_Parity = USART_Parity_No;
  52.                 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  53.                 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  54.                 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 開啟串口接收中斷
  55.                 USART_Init(USART1, &USART_InitStructure);
  56.                 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 開啟串口接收中斷
  57.                

  58.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //設置優先級分組為2

  59.                 NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;        //USART1中斷
  60.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級
  61.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優先級
  62.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
  63.                 NVIC_Init(&NVIC_InitStructure); //初始化

  64.                 USART_Cmd(USART1,ENABLE);

  65. }





  66. void PIDperiodinit(u16 arr,u16 psc)
  67. {
  68.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  69.         NVIC_InitTypeDef NVIC_InitStructure;

  70.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //時鐘使能
  71.         
  72.         //定時器TIM6初始化
  73.         TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值        
  74.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值
  75.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim
  76.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
  77.         TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx的時間基數單位
  78.         TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中斷標志位

  79.         TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能指定的TIM6中斷,允許更新中斷

  80.         //中斷優先級NVIC設置
  81.         NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM6中斷
  82.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優先級1級
  83.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //從優先級1級
  84.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  85.         NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


  86.         TIM_Cmd(TIM6, ENABLE);  //放在主程序中使能


  87. }
  88.         int curcount2=0;
  89.         int curcount1=0;

  90. int main(void)
  91. {
  92.         

  93.                 int i=0;
  94.                 int j=0;
  95.                 int t[20]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190};
  96.                 int n[20]={0};
  97.                 u8 jishu=0;
  98.                 int pwm=0;
  99.                 int sum=0;
  100.                 int N1_avr=0;
  101.                 int curcount3=0;
  102.                 int N1=0;
  103.                 int N2=0;
  104.                 int N3=0;
  105.          
  106.                 USART_Configuration();
  107.                 ENC_Init_TIM2(); // 1號電機
  108.                 TIM3_PWM_configure(1000-1,0); //PWM輸出,1000HZ
  109. //                ENC_Init_TIM4(); // 2號電機
  110. //                ENC_Init_TIM5();  // 3號電機
  111.                
  112. //                incPIDinit();                                                //初始化,將PID參數置0
  113. //                PID_setpoint(&PID1,50);                //設定1號電機轉速
  114. //                PID_setpoint(&PID2,50);                //設定2號電機轉速
  115. //                PID_setpoint(&PID3,50);                //設定3號電機轉速
  116. //                set_speed(80);
  117. //                PID_set(&PID1,5,0,0);                //設定1號電機PID參數
  118. //                PID_set(&PID2,2,0.5,0);                //設定2號電機PID參數
  119. //                PID_set(&PID3,2,0.5,0);                //設定3號電機PID參數
  120.                 PIDperiodinit(2000-1,720-1);        //PID 采樣定時器設定,采樣周期20ms        

  121.                 while(1)
  122.                 {
  123.                          if(flag==1)
  124.                                 {
  125.                                        
  126.                                         curcount1=TIM2->CNT-32768;        
  127.                                          TIM2->CNT=32768;
  128.                                         jishu++;



  129. //                                        curcount2=TIM4->CNT-32768;        
  130. //                                         TIM4->CNT=32768;
  131. //
  132. //                                        curcount3=TIM5->CNT-32768;        
  133. //                                         TIM5->CNT=32768;
  134. //
  135.                                     N1=15*(curcount1)/44; // N=125*curcount/188;  N=125*curcount/1792;
  136.                                         Data_Send_speed(curcount1,N1);


  137. //                                        sum=sum+N1;
  138. //                                        Data_Send_speed(t,N1);
  139. //                                        printf("%d\n", sum);
  140. //                                        if(jishu==10)
  141. //                                        {
  142. //                                                if(pwm>1000) { pwm=0; }
  143. //                                                N1_avr=sum/10;
  144. //                                                sum=0;
  145. //                                                jishu=0;
  146. //                                       
  147. //                                                Data_Send_speed(pwm,N1_avr);        
  148. //                                                pwm=pwm+30;
  149. //                                                TIM_SetCompare1(TIM3,pwm);
  150. ////                                                printf("%d\n", N1_avr);
  151. //
  152. //                                        }

  153.                                     flag=0;
  154.         
  155.                                 }
  156.                 }

  157. }


  158. void TIM6_IRQHandler(void)        //        采樣時間到,中斷處理函數
  159. {         
  160.         
  161. if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)//更新中斷
  162.     {
  163.                 TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中斷標志位
  164. //                GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));
  165.                 flag=1;

  166.         }
  167. }

  168. void USART1_IRQHandler(void)
  169. {

  170.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //判斷是否來中斷
  171.         {
  172.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標志位
  173.                 RX_Command[0]=(USART_ReceiveData(USART1));

  174.                 if(RX_Command[0]==0x0)
  175.                 {
  176.                         AIN1=0;
  177.                         AIN2=0;
  178.                         BIN1=0;
  179.                         BIN2=0;
  180.                         CIN1=0;
  181.                         CIN2=0;
  182.                 }

  183.                 if(RX_Command[0]==0x01)
  184.                 {
  185.                         AIN1=1;
  186.                         AIN2=0;
  187.                         BIN1=1;
  188.                         BIN2=0;
  189.                         CIN1=1;
  190.                         CIN2=0;        
  191.                 }

  192.                 if(RX_Command[0]==0x02)
  193.                 {
  194.                         AIN1=0;
  195.                         AIN2=1;
  196.                         BIN1=0;
  197.                         BIN2=1;
  198.                         CIN1=0;
  199.                         CIN2=1;
  200.                 }
  201.                  if((RX_Command[0] > 0x32) && (RX_Command[0] < 0x64)) //判斷發送數據是否在0x32~0x64之間
  202.                 {        
  203.                         u16 val;
  204.                         val=10*((RX_Command[0]) & (0x00FF));                         //根據發送數據,計算占空比的實際值
  205.                         TIM_SetCompare1(TIM3,val);
  206.                         TIM_SetCompare2(TIM3,val);
  207.                         TIM_SetCompare3(TIM3,val);                                                 //設置占空比
  208. //                        USART_SendData(USART1,RX_Command[0]);
  209.                         
  210.                 }

  211.         }

  212. }
復制代碼

所有資料51hei提供下載:
Orthogonal encoder.7z (194.08 KB, 下載次數: 29)


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

使用道具 舉報

沙發
ID:1 發表于 2019-4-17 17:59 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂免费看片 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 久热久 | 亚洲黄色国产 | 色秀网站| 中文字幕日韩欧美 | 成人片免费看 | 亚洲一区 中文字幕 | 欧美 日韩 综合 | 欧美久久天堂 | 日韩久久精品电影 | 精品欧美一区二区三区免费观看 | 日日夜夜操天天干 | 特黄视频| 国产精品乱码一区二区三区 | 一区二区三区电影在线观看 | 精品国产乱码久久久久久丨区2区 | 日韩视频一区二区 | 国产高清精品一区二区三区 | 日本特黄a级高清免费大片 成年人黄色小视频 | 国产在线对白 | 一级毛片视频 | 国产一区二区久久 | 台湾a级理论片在线观看 | 日本一区二区视频 | 日韩av一区二区在线观看 | 久久国产亚洲精品 | 福利片在线看 | 青青操av| 欧洲亚洲精品久久久久 | 一区二区精品视频 | 日本激情视频在线播放 | 免费一区 | 免费在线观看av片 | 国产91丝袜| 成年人在线观看视频 | 91久久久久久久久久久 | 国产精品久久久久久久三级 | 欧美成人精品 | 涩涩视频网 | 久久久久久久97 |