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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32f407進行直流電機pid調速源程序

  [復制鏈接]
跳轉到指定樓層
樓主
stm32f407驅動電機進行pid調速。

單片機源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "adc.h"
  7. #include "key.h"
  8. #include "encoder.h"
  9. #include "moter.h"
  10. #include "pwm.h"
  11. #include "tim.h"

  12. #define BYTE0(dwTemp)       ( *( (char *)(&dwTemp)          ) )
  13. #define BYTE1(dwTemp)       ( *( (char *)(&dwTemp) + 1) )
  14. #define BYTE2(dwTemp)       ( *( (char *)(&dwTemp) + 2) )
  15. #define BYTE3(dwTemp)       ( *( (char *)(&dwTemp) + 3) )
  16.    
  17. u8 testdatatosend[50];
  18. void Test_Send_User(uint16_t data1, uint16_t data2, uint16_t data3,uint16_t data4,uint16_t data5,uint16_t data6,uint16_t data7,uint16_t data8,uint16_t data9,uint16_t data10)        ;
  19. void UART1_Send_Str(unsigned char *s);
  20. u8 temp[50];
  21. char i=0;
  22. int now;
  23. int aim=50000;
  24. int error,last_error;
  25. int error_sum;
  26. int pwm=200;
  27. float KP=3.0
  28.        ,KI=0.32 //0.34
  29.         ,KD=50.0; //55.0
  30.   
  31. int main(void)
  32. {

  33.         u8 key;
  34.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
  35.         delay_init(168);    //初始化延時函數
  36.         uart_init(115200);        //初始化串口波特率為115200
  37.         LED_Init();                                        //初始化LED
  38.          LCD_Init();                                        //LCD初始化KEY_Init();                                 //按鍵初始化
  39.     TIM3_ENC_Init();
  40.     KEY_Init();
  41.     MOTER_Init();
  42.     LED_Init();
  43.     PWM_TIM4_Init(1000-1,84-1); //1000HZ
  44.     setPWM(pwm);
  45.     POINT_COLOR=RED;
  46.         LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");        
  47.         LCD_ShowString(30,70,200,16,16,"---PID---");        
  48.         LCD_ShowString(30,90,200,16,16,"MOTER:");
  49.         LCD_ShowString(30,110,200,16,16,"2014/5/6");         
  50.     TIM6_Int_Init(499,1679);
  51.                
  52.         while(1)
  53.         {
  54.         key=KEY_Scan(0);        
  55.         switch(key){
  56.             case 1: aim+=500;break;
  57.             case 2: aim-=500;break;
  58.         }
  59.         sprintf((char*)temp,"pwm:=%d    ",pwm);
  60.                 LCD_ShowString(30,130,200,16,16,temp);
  61.         sprintf((char*)temp,"encoder:=%d    ",read_TIM3_position());
  62.                 LCD_ShowString(30,150,200,16,16,temp);
  63.         sprintf((char*)temp,"aim:=%d    ",aim);
  64.                 LCD_ShowString(30,170,200,16,16,temp);
  65.         sprintf((char*)temp,"error:=%d    ",error);
  66.                 LCD_ShowString(30,190,200,16,16,temp);
  67.         Test_Send_User(now,aim,0,0,0,0,0,0,0,0);
  68.       
  69.                
  70.             
  71.                
  72.         }
  73. }
  74. void TIM6_DAC_IRQHandler(void)  //100HZ 中斷函數
  75. {

  76.     if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET)
  77.     {
  78.         if(++i==5)
  79.         {
  80.             i=0;
  81.             GPIO_ToggleBits(GPIOF,GPIO_Pin_9 );    //閃燈代表正在工作
  82.         }
  83.       
  84.         now=read_TIM3_position();   //get現在位置
  85.         error=now-aim;               //獲取誤差
  86.         if(error>=0)                 //如果error大于0 正轉動
  87.            { MOTER_CW();
  88.                LCD_ShowString(30,90,200,16,16,"++++++++++++++++");  //表示正轉動
  89.            }
  90.         else
  91.            { MOTER_CCW();
  92.                LCD_ShowString(30,90,200,16,16,"----------------");//表示反轉動
  93.            }            //如果error大于0 正轉動
  94.         error_sum+=error;      //誤差累計和
  95.        if(error_sum>1000)error_sum=1000;  //積分限幅
  96.        if(error_sum<-1000)error_sum=-1000;
  97.         pwm=error*KP+error_sum*KI+(error-last_error)*KD;  //pwm= 當前誤差*比例項 + 誤差累計*積分項 + 兩次誤差之差*微分項
  98.         last_error=error;           //誤差沖洗賦值
  99.         setPWM(pwm);         //設定PWM
  100.         
  101.             
  102.     }

  103.         
  104.         
  105.   TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

  106. }


  107. void Test_Send_User(uint16_t data1, uint16_t data2, uint16_t data3,uint16_t data4,uint16_t data5,uint16_t data6,uint16_t data7,uint16_t data8,uint16_t data9,uint16_t data10)        
  108. {
  109.         u8 _cnt=0;
  110.     u8 i;
  111.     u8 sum = 0;
  112.         
  113.         testdatatosend[_cnt++]=0xAA;
  114.         testdatatosend[_cnt++]=0x05;
  115.         testdatatosend[_cnt++]=0xAF;
  116.         testdatatosend[_cnt++]=0xF1;
  117.         testdatatosend[_cnt++]=0;

  118.         testdatatosend[_cnt++]=BYTE1(data1);
  119.         testdatatosend[_cnt++]=BYTE0(data1);
  120.         
  121.         testdatatosend[_cnt++]=BYTE1(data2);
  122.         testdatatosend[_cnt++]=BYTE0(data2);
  123.         
  124.         testdatatosend[_cnt++]=BYTE1(data3);
  125.         testdatatosend[_cnt++]=BYTE0(data3);
  126.         
  127.         testdatatosend[_cnt++]=BYTE1(data4);
  128.         testdatatosend[_cnt++]=BYTE0(data4);
  129.         
  130.         testdatatosend[_cnt++]=BYTE1(data5);
  131.         testdatatosend[_cnt++]=BYTE0(data5);
  132.         
  133.         testdatatosend[_cnt++]=BYTE1(data6);
  134.         testdatatosend[_cnt++]=BYTE0(data6);
  135.         
  136.         testdatatosend[_cnt++]=BYTE1(data7);
  137.         testdatatosend[_cnt++]=BYTE0(data7);
  138.         
  139.         testdatatosend[_cnt++]=BYTE1(data8);
  140.         testdatatosend[_cnt++]=BYTE0(data8);
  141.         
  142.         testdatatosend[_cnt++]=BYTE1(data9);
  143.         testdatatosend[_cnt++]=BYTE0(data9);
  144.         
  145.         testdatatosend[_cnt++]=BYTE1(data10);
  146.         testdatatosend[_cnt++]=BYTE0(data10);
  147.         
  148.         

  149.         testdatatosend[4] = _cnt-5;
  150.         
  151.                
  152.         for( i=0;i<_cnt;i++)
  153.                 sum += testdatatosend[i];
  154.         
  155.         testdatatosend[_cnt++]=sum;        

  156.         UART1_Send_Str(testdatatosend);
  157. }

  158. void UART1_Send_Str(unsigned char *s)//發送字符串 函數   應用指針 方法
  159. {
  160.         unsigned char i=0;  //定義一個局部變量  用來 發送字符串 ++運算

  161.         while(s[i]!=' ')  // 每個字符串結尾 都是以   結尾的
  162.         {
  163.                 USART_SendData(USART1,s[i]);        //通過庫函數  發送數據
  164.                 while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);  
  165.                 //等待發送完成。   檢測 USART_FLAG_TC 是否置1;    //見庫函數 P359 介紹

  166.                 i++;                 //i++一次
  167.         }

  168. }
復制代碼

所有資料51hei提供下載:
PID教程視頻對應代碼.7z (343.65 KB, 下載次數: 123)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1080782 發表于 2023-7-13 19:22 | 只看該作者
視頻在哪里
回復

使用道具 舉報

板凳
ID:1089424 發表于 2023-7-27 21:31 | 只看該作者
我的好哥哥,視頻在哪里呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 在线看亚洲 | 午夜欧美a级理论片915影院 | av一区二区三区四区 | 精品电影| jlzzxxxx18hd护士 | 美国十次成人欧美色导视频 | 日韩精品一区二区久久 | 国产综合视频 | 国产aⅴ爽av久久久久久久 | 久久久久综合 | 中文字幕在线视频精品 | 日本一区二区三区免费观看 | 中文字幕精品一区 | 亚洲精品在线视频 | 午夜精品久久久久久久99黑人 | 三级黄色片在线播放 | aaaa日韩| 国产在线第一页 | 免费观看视频www | 精品在线观看一区二区 | 黄色片视频免费 | 可以在线观看av的网站 | 免费av一区二区三区 | 日韩一区二区三区视频 | 亚洲免费一 | 亚洲网在线 | 日韩精品一区二区三区在线观看 | 亚洲激情在线观看 | 亚洲精品久久久一区二区三区 | 久久国产精品久久久久久久久久 | 成人综合在线视频 | 久久福利电影 | 中文字幕一区在线观看视频 | 成人蜜桃av| 成人一区二区三区视频 | 91在线免费观看 | 国产精品久久久久久久久久久久 | 午夜激情网 | 中国美女一级黄色片 | 人人干人人玩 |