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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3723|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32電機(jī)閉環(huán)控制程序Orthogonal encoder

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:453328 發(fā)表于 2019-4-17 15:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1. #include "stm32f10x.h"

  2. //#include"delay.h"        //延時(shí)函數(shù)
  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計(jì)算后輸出的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;//定義結(jié)構(gòu)體
  18.                 NVIC_InitTypeDef NVIC_InitStructure;
  19.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); //使能A端口、端口復(fù)用時(shí)鐘

  20.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // PA.8        PA.8,作為捕獲輸入脈沖中斷的標(biāo)志,進(jìn)入中斷點(diǎn)亮LED燈
  21.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度
  22.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  23.                 GPIO_Init(GPIOA, &GPIO_InitStructure); //結(jié)構(gòu)體初始化
  24.         
  25.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // PA.4  PA.4,作為定時(shí)器中斷的標(biāo)志,20ms定時(shí),進(jìn)入中斷點(diǎn)亮LED燈
  26.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度
  27.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  28.                 GPIO_Init(GPIOA, &GPIO_InitStructure); //結(jié)構(gòu)體初始化
  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;    //復(fù)用推挽輸出
  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;   //復(fù)用浮空輸入
  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         控制電機(jī)正反轉(zhuǎn)
  41.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速度
  42.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
  43.                 GPIO_Init(GPIOE, &GPIO_InitStructure); //結(jié)構(gòu)體初始化

  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);        //使能時(shí)鐘
  48.             USART_InitStructure.USART_BaudRate = 115200;                                //波特率設(shè)為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);        //設(shè)置優(yōu)先級(jí)分組為2

  59.                 NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;        //USART1中斷
  60.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級(jí)
  61.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優(yōu)先級(jí)
  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); //時(shí)鐘使能
  71.         
  72.         //定時(shí)器TIM6初始化
  73.         TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值        
  74.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
  75.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
  76.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
  77.         TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
  78.         TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中斷標(biāo)志位

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

  80.         //中斷優(yōu)先級(jí)NVIC設(shè)置
  81.         NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM6中斷
  82.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優(yōu)先級(jí)1級(jí)
  83.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //從優(yōu)先級(jí)1級(jí)
  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號(hào)電機(jī)
  108.                 TIM3_PWM_configure(1000-1,0); //PWM輸出,1000HZ
  109. //                ENC_Init_TIM4(); // 2號(hào)電機(jī)
  110. //                ENC_Init_TIM5();  // 3號(hào)電機(jī)
  111.                
  112. //                incPIDinit();                                                //初始化,將PID參數(shù)置0
  113. //                PID_setpoint(&PID1,50);                //設(shè)定1號(hào)電機(jī)轉(zhuǎn)速
  114. //                PID_setpoint(&PID2,50);                //設(shè)定2號(hào)電機(jī)轉(zhuǎn)速
  115. //                PID_setpoint(&PID3,50);                //設(shè)定3號(hào)電機(jī)轉(zhuǎn)速
  116. //                set_speed(80);
  117. //                PID_set(&PID1,5,0,0);                //設(shè)定1號(hào)電機(jī)PID參數(shù)
  118. //                PID_set(&PID2,2,0.5,0);                //設(shè)定2號(hào)電機(jī)PID參數(shù)
  119. //                PID_set(&PID3,2,0.5,0);                //設(shè)定3號(hào)電機(jī)PID參數(shù)
  120.                 PIDperiodinit(2000-1,720-1);        //PID 采樣定時(shí)器設(shè)定,采樣周期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)        //        采樣時(shí)間到,中斷處理函數(shù)
  159. {         
  160.         
  161. if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)//更新中斷
  162.     {
  163.                 TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中斷標(biāo)志位
  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) //判斷是否來(lái)中斷
  171.         {
  172.                 USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標(biāo)志位
  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)) //判斷發(fā)送數(shù)據(jù)是否在0x32~0x64之間
  202.                 {        
  203.                         u16 val;
  204.                         val=10*((RX_Command[0]) & (0x00FF));                         //根據(jù)發(fā)送數(shù)據(jù),計(jì)算占空比的實(shí)際值
  205.                         TIM_SetCompare1(TIM3,val);
  206.                         TIM_SetCompare2(TIM3,val);
  207.                         TIM_SetCompare3(TIM3,val);                                                 //設(shè)置占空比
  208. //                        USART_SendData(USART1,RX_Command[0]);
  209.                         
  210.                 }

  211.         }

  212. }
復(fù)制代碼

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


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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一二三区 | 91蝌蚪少妇偷拍 | 国产精品久久久久久久久久久久午夜片 | 日韩亚洲欧美在线观看 | av网站免费在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产精品天堂 | 成人毛片一区二区三区 | jlzzzjlzzz国产免费观看 | 丨国产丨调教丨91丨 | 国产在线天堂 | 国产伦精品一区二区三区88av | 国产黄色免费网站 | 久久精品在线视频 | 福利视频午夜 | av免费网站 | av福利网站| 国产一级免费视频 | 欧美视频在线播放 | 91精品久久久久久久久 | 日韩午夜精品 | 色婷婷中文字幕 | 久婷婷 | 97久久久久 | 午夜视频在线播放 | 欧美国产一区二区 | 国产一区二区中文字幕 | 少妇高潮毛片 | 老女人毛片 | 一级做a爱片性色毛片 | 欧美一级特黄视频 | 黄色一级大片在线免费看产 | 69福利视频 | 亚洲看片 | 成人免费网站在线观看 | jlzzjlzz欧美大全| 日韩精品久久久久久久酒店 | 亚洲视频不卡 | 成年人网站在线免费观看 | 特级丰满少妇一级aaaa爱毛片 | 免费理论片 |