找回密码
 立即注册

QQ登录

只需一步,快速开始

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

舵机控制器STM32源程序

[复制链接]
跳转到指定楼层
楼主
ID:339076 发表于 2018-5-27 14:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分享一个舵机驱动程序

单片机源程序如下:
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "stm32f10x.h"                                            //包含stm32库系统头文件
  4. #include "servor.h"                                                        //包含GPIO库头文件
  5. #include "usart.h"                                                          //包含串口通信设置头文件
  6. #include "delay.h"                                                //包含系统定时器库头文件
  7. #include "timer.h"                                        //包含定时器设置头文件
  8. #include "PS2.h"
  9. #include "key.h"
  10. #include "led.h"
  11. #include "beep.h"
  12. #include "flash.h"
  13. #include "common.h"
  14. #include "adc.h"
  15. const u8 TEXT_Buffer[]={"Flash SPI TEST"};
  16. #define SIZE sizeof(TEXT_Buffer)       
  17.         u8 datatemp[SIZE];
  18.         u32 FLASH_SIZE;
  19. u8 date[3];                                                                        //该变量用来存储安卓终端发来的数据
  20. u32 value;                                                                       
  21. u32 key, key_bak;
  22. extern u32 a;                                                                  //a用来计数,配合系统滴答定时器可检测代码运行时间
  23. extern uint8 flag_RecFul;
  24. uint16 pos[7][MOTOR_NUM]={ {1000,1500,1500,1500,1500,1500,1500,1500,1500},
  25.                                          {1000,1500,1500,1500,1500,1500,1500,1500,1500},
  26.                                          {1000,1500,1500,1500,1500,1500,1500,1500,1500},
  27.                                          {1000,500,500,500,500,500,500,500,500},
  28.                                          {1000,1500,1500,1500,1500,1500,1500,1500,1500},
  29.                                          {1000,500,500,500,500,500,500,500,500},
  30.                                          {1000,1500,1500,1500,1500,1500,1500,1500,1500}
  31. };         //位置
  32. uint16 CPWM[MOTOR_NUM]=   {1500,1500,1500,1500,1500,1500,1500,1500,1500};
  33. uint16 UartRec[MOTOR_NUM]={1500,1500,1500,1500,1500,1500,1500,1500,1500};

  34. unsigned int dj1=1500;
  35. unsigned int dj2=1500;
  36. unsigned int dj3=1500;
  37. unsigned int dj4=1500;
  38. unsigned int dj5=1500;
  39. unsigned int dj6=1600;
  40. unsigned char buf[30];

  41. uint8 line=0;                                        //缓存存入口与出口之间的距离,即当前缓存中有多少个没有执行的数据
  42. char point_now=0;                                //与point_aim一起标记缓存出口位置,即取数位置
  43. char point_aim=1;
  44. char point_in=1;                                //标记缓存入口位置,即上一行数据存放位置
  45. uint8 flag_connect = 0;
  46. uint8 flag_stop=1;                                //表示一行执行结束
  47. uint8 flag_vpwm=0;                                //表示到达了该更新pwm[]的时间
  48. uint8 flag_in=1;                                         //表示缓存中有空闲空间
  49. uint8 flag_out=0;                                        //表示缓存中有可执行数据的标志位
  50. uint8 flag_run_ready=0;                        //表示有要要放入缓存的EErom数据

  51. uint16 n=1000;                                        //用来计算需要建立多少个中间数据
  52. uint16 m=1;                                                //用来累计已经执行了多少中间数据
  53. double dp;
  54. double dp0[MOTOR_NUM] = {0};                                        //插补增量
  55. uint8 flag_download = 0;//判断是否下载
  56. uint8 flag_read = 0;// 读取flash内容,发送上位机
  57. uint8 flag_connect_run = 0;//连接上位机的执行flash保存的命令
  58. uint8 flag_stop_download = 0;//停止下载
  59. uint8 flag_online_run = 0;
  60. uint8 flag_uart2_rev = 0;
  61. uint8 flag_uart2_rev_time_out = 0;
  62. uint8 flag_ps2_rev = 0;
  63. char redata[257] = {0};    // 定义接收数据变量数组
  64. //uint8 flag_read_adc = 0;

  65. unsigned long send_mode = 0;//当前串口接收到命令状态存储
  66. MotorData motor_data;//舵机总信息
  67. MotorOneCmd motor_one_cmd;//单个命令
  68. CurrentItem cur_item;
  69. uint16 tuoji_count = 0;//脱机执行次数
  70. unsigned char flag_scan_ps2 = 0;
  71. uint8 flag_adc=0;
  72. uint8 error = 0;
  73. uint8 file_list[MAX_SUPPORT_FILE_SAVE] = {0};
  74. int file_list_count = 0;
  75. int file_last_num = 0;
  76. unsigned char ps2_buf[120] = {0};
  77. char uart2_buf[50] = {0};
  78. uint16 cur_count = 0;
  79. uint16 adc_value=0;
  80. //uchar ad_value = 0;
  81. //uchar beep_mode = 0;
  82. u8 ps2_mode=0;
  83. void SerVor_Test(void);
  84. void Ps2_Test(void);
  85. void Flash_Test(void);
  86. void updata_file_list(void);
  87. void InitMotor(void);
  88. void vpwm(void);
  89. void scan_ps2(void);
  90. void Check_Power(void);
  91. /**********************************************************************************/
  92. /*****************************主函数***********************************************/
  93. int main(void)
  94. {   
  95.         SysTick_Init();                                                                           //系统滴答定时器初始化
  96.         Servor_GPIO_Config();                                                                           //GPIO初始化
  97.   Uart_Init(1);
  98.   Uart_Init(2);       
  99.         Timer_Init();                                                                           //定时器初始化
  100.         Timer_ON();                                                                                   //开启定时器                        
  101.         LED_Init();       
  102.         Beep_Init();
  103.         PS2_Init();
  104.         Adc_Init();
  105.         USART_Config(USART1,115200);
  106.         USART_Config(USART2,115200);
  107.         SpiFlashInit();                  //初始化flash         
  108.         Led_Test();
  109.         Beep_Test();
  110.        
  111.         while(SpiFlashReadID()!=W25Q64)                                                        //检测不到W25Q64
  112.         {
  113.                 UART_PutStr (USART1,"Not Found W25Q64\r\n");
  114.         }

  115.         while (1)
  116.         {       
  117.         //        Flash_Test();
  118.         //UART_PutStr (USART2,"uart2 test\r\n");
  119.                 if(flag_vpwm==1)                  
  120.                 {       
  121.                         vpwm();                                        //更新pwm[]数组
  122.                         flag_vpwm=0;
  123.                 }
  124.                 if( flag_RecFul==1)                   //串口接受完一条指令
  125.                 {
  126.                        
  127.                         //LED3_ON();
  128.                          DealRec();                                 //处理串口缓存中的数据
  129.                         flag_RecFul=0;
  130.                         //LED3_OFF();
  131.                 }
  132.                 GetOneMotorCMD();//获取一个命令
  133.                 SendUartState();//发送状态信息
  134.   #if PS_SUPPORT
  135.                  scan_ps2();
  136.   #endif
  137.         //        LED_State();
  138.                 Check_Power();
  139.                 //cur_count++;
  140.         }
  141. }


  142. void updata_file_list(void)
  143. {
  144.         unsigned char i = 0;
  145.         unsigned char j = 0;
  146.         file_last_num = -1;
  147.         ReadMoterInfor();
  148.         for (i = 0; i < motor_data.filecount; i++)
  149.         {
  150.                 if (motor_data.file_flag[i] == 1)
  151.                 {
  152.                         file_list[j] = i;
  153.                         j++;
  154.                         file_last_num = i;
  155.                 }
  156.         }
  157.         file_list_count = j;
  158. }
  159. void InitMotor(void)
  160. {
  161.         ReadMoterInfor();//读取舵机控制信息
  162.         updata_file_list();
  163.         memset(&cur_item,0,sizeof(cur_item));
  164.         //beep_mode = motor_data.beep_mode;
  165. }

  166. void Check_Power(void)
  167. {
  168.                 if(flag_adc==1)
  169.                 {
  170.                         flag_adc=0;
  171.                         adc_value=Get_Adc(0);
  172.                         if(adc_value>=2100 && adc_value<=2481) //电池电量低  7.4V锂电池这里当电池电压低于6V就算没电   >2100是为了防止没接电池误报
  173.                         {
  174.                                 Beep=~Beep;
  175.                         }
  176.                         else
  177.                         {
  178.                                 BEEP(OFF);
  179.                         }
  180.                         //UART_Put_Inf("adc:",adc_value); //将读取到ADC1 通道0的ADC值打印出来
  181.                 }
  182. }

  183. void scan_ps2(void)
  184. {
  185.         int  kind = 0;
  186.         char *p = NULL;
  187.         char buf[15] = {0};
  188.         char i = 0;
  189.         if (flag_scan_ps2)//
  190.         {
  191.                 flag_scan_ps2 = 0;
  192.                 key = PS2_DataKey();
  193.                 ps2_mode=PS2_RedLight();
  194.                 if(ps2_mode==0)
  195.                 {
  196.                         if(key_bak == key)return;
  197.                         key_bak=key;
  198.                         Beep=~Beep;
  199.                         switch(key)
  200.                         {
  201.                                 case PSB_PAD_UP:kind = 1;break;
  202.                                 case PSB_PAD_DOWN:kind = 2;break;
  203.                                 case PSB_PAD_LEFT:kind = 3;break;
  204.                                 case PSB_PAD_RIGHT:kind = 4;break;

  205.                                 case PSB_TRIANGLE:kind = 7;break;
  206.                                 case PSB_CROSS:kind = 8;break;
  207.                                 case PSB_PINK:kind = 9;break;
  208.                                 case PSB_CIRCLE:kind = 10;break;

  209.                                 case PSB_L1:kind = 6;break;
  210.                                 case PSB_L2:kind = 5;break;
  211.                                 case PSB_R1:kind = 12;break;
  212.                                 case PSB_R2:kind = 11;break;
  213.                                 default:break;
  214.                         }
  215.                         if (kind != 0)
  216.                         {               
  217.                                 flag_ps2_rev = 1;
  218.                                 flag_connect = 1;
  219.                                 SpiFlashRead(ps2_buf,(PS2_FLASH_ADDR)<<WRITE_BIT_DEPTH,sizeof(ps2_buf));
  220.                                 sprintf(buf,"%dK",kind);
  221.                                 UART_PutStr(USART1,buf);
  222.                                 p = strstr(ps2_buf,buf);
  223.                                 if (p != NULL)
  224.                                 {
  225.                                         p = p + strlen(buf);
  226.                                         while(i < 14 && *p != 0)
  227.                                         {
  228.                                                 buf[i] = *p++;
  229.                                                 i++;
  230.                                                 if (*p == '#')
  231.                                                         break;
  232.                                         }
  233.                                         if (i < 12)
  234.                                         {
  235.                                                 buf[i] = '\r';
  236.                                                 buf[i+1] = '\n';
  237.                                                 memcpy(redata,buf,sizeof(buf));
  238.                                                 flag_RecFul = 1;
  239.                                         }
  240.                                         UART_PutStr(USART1,redata);
  241.                         }
  242.                 }
  243.                 }
  244.                 else if(ps2_mode==1)
  245.                 {
  246.                                 switch(key)
  247.                                 {
  248.                                         case PSB_PAD_UP:CPWM[1]+=10;if(CPWM[1]>=2300)   CPWM[1]=2300;dj1+=10;if(dj1>=2200)dj1=2200;sprintf(buf,"#1P%dT1\r\n",dj1);UART_PutStr(USART2,buf);break;
  249.                                         case PSB_PAD_DOWN:CPWM[1]-=10;if(CPWM[1]<=700)  CPWM[1]=700;dj1-=10;if(dj1<=700)dj1=700;sprintf(buf,"#1P%dT1\r\n",dj1);UART_PutStr(USART2,buf);break;
  250.                                         case PSB_PAD_LEFT:CPWM[2]+=10;if(CPWM[2]>=2300) CPWM[2]=2300;dj2+=10;if(dj2>=2200)dj2=2200;sprintf(buf,"#2P%dT1\r\n",dj2);UART_PutStr(USART2,buf);break;
  251.                                         case PSB_PAD_RIGHT:CPWM[2]-=10;if(CPWM[2]<=700) CPWM[2]=700;dj2-=10;if(dj2<=700)dj2=700;sprintf(buf,"#2P%dT1\r\n",dj2);UART_PutStr(USART2,buf);break;
  252.                
  253.                                         case PSB_TRIANGLE:CPWM[3]+=10;if(CPWM[3]>=2300) CPWM[3]=2300;dj3+=10;if(dj3>=2200)dj3=2200;sprintf(buf,"#3P%dT1\r\n",dj3);UART_PutStr(USART2,buf);break;
  254.                                         case PSB_CROSS:CPWM[3]-=10;if(CPWM[3]<=700)  CPWM[3]=700;dj3-=10;if(dj3<=700)dj3=700;sprintf(buf,"#3P%dT1\r\n",dj3);UART_PutStr(USART2,buf);break;
  255.                                         case PSB_PINK:CPWM[4]+=10;if(CPWM[4]>=2300)  CPWM[4]=2300;dj4+=10;if(dj4>=2300)dj4=2300;sprintf(buf,"#4P%dT1\r\n",dj4);UART_PutStr(USART2,buf);break;
  256.                                         case PSB_CIRCLE:CPWM[4]-=10;if(CPWM[4]<=700) CPWM[4]=700;dj4-=10;if(dj4<=700)dj4=700;sprintf(buf,"#4P%dT1\r\n",dj4);UART_PutStr(USART2,buf);break;

  257.                                         case PSB_L1:CPWM[5]+=10;if(CPWM[5]>=2300) CPWM[5]=2300;dj5+=10;if(dj5>=2200)dj5=2200;sprintf(buf,"#5P%dT1\r\n",dj5);UART_PutStr(USART2,buf);break;
  258.                                         case PSB_L2:CPWM[5]-=10;if(CPWM[5]<=700)  CPWM[5]=700;dj5-=10;if(dj5<=700)dj5=700;sprintf(buf,"#5P%dT1\r\n",dj5);UART_PutStr(USART2,buf);break;
  259.                                         case PSB_R1:CPWM[6]+=10;if(CPWM[6]>=2300) CPWM[6]=2300;dj6+=10;if(dj6>=2300)dj6=2300;sprintf(buf,"#6P%dT1\r\n",dj6);UART_PutStr(USART2,buf);break;
  260.                                         case PSB_R2:CPWM[6]-=10;if(CPWM[6]<=700)  CPWM[6]=700;dj6-=10;if(dj6<=700)dj6=700;sprintf(buf,"#6P%dT1\r\n",dj6);UART_PutStr(USART2,buf);break;
  261.                                         default:break;
  262.                                 }
  263.                 }
  264.         }
  265. }


  266. /***************************************************************************************************************
  267. 函 数 名:从flash读取舵机总的信息
  268. 功能描述:初始化舵机控制信息
  269. 输入参数:无  
  270. 返 回 值:无  
  271. 备    注:
  272. ****************************************************************************************************************/       
  273. void ReadMoterInfor(void)
  274. {
  275.         memset(&motor_data,0,sizeof(motor_data));//清 0
  276.         SpiFlashRead((unsigned char *)&motor_data,(CMD_FLASH_ADDR)<<WRITE_BIT_DEPTH,sizeof(motor_data));//读取信息
  277.         if (motor_data.CRC1 != 0x12345678 || motor_data.sum < 0 || motor_data.duoji_count  > MOTOR_NUM)//判断信息存储是否有错
  278.         {
  279.                 memset(&motor_data,0,sizeof(motor_data));
  280.                 //memset(&cur_item,0,sizeof(cur_item));
  281.         }
  282.         else//正常信息
  283.         {
  284.         //        UART1_SendOneChar(motor_data.sum + 0x30);
  285.                 //cur_item.tuoji_count = motor_one_cmd.tuoji_count;//脱机运行次数
  286.                 //cur_item.cur_num = 0;//清 0
  287.         }
  288.                
  289. }
  290. void ReadOneCmdInfor(unsigned int addr)
  291. {
  292.         memset(&motor_one_cmd,0,sizeof(motor_one_cmd));//清 0
  293.         SpiFlashRead((unsigned char *)&motor_one_cmd,((((unsigned long)addr)<<4) + FILE_FLASH_ADDR)<<WRITE_BIT_DEPTH,sizeof(motor_one_cmd));//读取信息
  294.         if (motor_one_cmd.start >= motor_one_cmd.end || motor_one_cmd.cur_file_num != (addr) || motor_data.file_flag[motor_one_cmd.cur_file_num] == 0)//判断信息存储是否有错
  295.         {
  296.                 memset(&motor_one_cmd,0,sizeof(motor_one_cmd));
  297.         }
  298.         else//正常信息,以后留着验证用的
  299.         {
  300.                
  301.                
  302.                 cur_item.tuoji_count = motor_one_cmd.tuoji_count;//脱机运行次数
  303.                 cur_item.cur_num = motor_one_cmd.start;
  304.         //        UART1_SendOneChar(motor_one_cmd.tuoji_count + 0x30);
  305.         //        cur_item.cur_num = 0;//清 0
  306.         }
  307.                
  308. }
  309. /***************************************************************************************************************
  310. 函 数 名:把舵机信息写到flash中
  311. 功能描述:把舵机信息写到flahs中
  312. 输入参数:无  
  313. 返 回 值:无  
  314. 备    注:
  315. ****************************************************************************************************************/       
  316. void WriteMoterInfor(void)
  317. {
  318.         unsigned char temp =0;
  319.         motor_data.CRC1 = 0x12345678;//校验码
  320.         motor_data.duoji_count = MOTOR_NUM-1;
  321.         temp = motor_data.filecount;
  322.         SpiFlashEraseSector(CMD_FLASH_ADDR >> 4);//擦除以前存储的信息
  323.         SpiFlashWrite((unsigned char *)&motor_data,CMD_FLASH_ADDR<<WRITE_BIT_DEPTH,sizeof(motor_data)); //写入flash
  324.         ReadMoterInfor();
  325.         if (temp != motor_data.filecount)
  326.         {
  327.                 error |= ERROR_FLASH_WRITE;
  328.         }
  329.         else
  330.         {
  331.                 error &= ~ERROR_FLASH_WRITE;
  332.         }
  333. }
  334. void WriteOneCmdInfor(unsigned int addr)
  335. {
  336.         unsigned char temp = 0;
  337.         temp = motor_one_cmd.end;
  338.         if (((((unsigned long)addr)<<4) + FILE_FLASH_ADDR) % 16 == 0)
  339.                 SpiFlashEraseSector(((((unsigned long)addr)<<4) + FILE_FLASH_ADDR) >> 4);//擦除以前存储的信息
  340.         SpiFlashWrite((unsigned char *)&motor_one_cmd,((((unsigned long)addr)<<4) + FILE_FLASH_ADDR)<<WRITE_BIT_DEPTH,sizeof(motor_one_cmd)); //写入flash
  341.         ReadOneCmdInfor(addr);
  342.         if (temp !=  motor_one_cmd.end)
  343.         {
  344.                 error |= ERROR_FLASH_WRITE1;
  345.         }
  346.         else
  347.         {
  348.                 error &= ~ERROR_FLASH_WRITE1;
  349.         }
  350. }
  351. /***************************************************************************************************************
  352. 函 数 名:获取一串舵机的控制字符串
  353. 功能描述:处理从flash读取的舵机控制字符串处理
  354. 输入参数:无  
  355. 返 回 值:无  
  356. 备    注:
  357. ****************************************************************************************************************/       
  358. void GetOneMotorCMD(void)
  359. {
  360. #if DEBUG
  361.         uchar buf[20] = {0};
  362. #endif
  363.         if (flag_stop_download)//接收到了上位机的停止下载的命令
  364.         {
  365.                 flag_download = 0;//清楚下载状态标志位
  366.                 flag_stop_download = 0;
  367.                 flag_read = 0;
  368.                 if (motor_data.filecount < MAX_SUPPORT_FILE_SAVE)
  369.                 {
  370.                         updata_file_list();
  371.                         motor_data.sum = motor_one_cmd.end;
  372.                         motor_data.file_flag[motor_data.filecount] = 1;
  373.                         motor_one_cmd.cur_file_num = file_last_num + 1;
  374.                         motor_data.filecount = motor_one_cmd.cur_file_num + 1;
  375.                         error &= ~MAX_SUPPORT_FILE_SAVE;
  376. #if DEBUG
  377.                         sprintf(buf,"%d %d\r\n",(uint)motor_data.filecount,(uint)motor_data.file_flag[motor_data.filecount-1]);
  378.                         UART_PutStr(USART1,buf);
  379. #endif
  380.                         WriteMoterInfor();
  381.                         WriteOneCmdInfor(motor_one_cmd.cur_file_num);
  382.                         updata_file_list();
  383. #if DEBUG
  384.                        
  385.                         sprintf(buf,"%d %d\r\n",(uint)motor_data.filecount,(uint)motor_data.file_flag[motor_data.filecount-1]);
  386.                         UART_PutStr(USART1,buf);
  387. #endif
  388.                 }
  389.                 else
  390.                 {
  391.                         error |= MAX_SUPPORT_FILE_SAVE;
  392.                 }
  393.                 if        (!(error &(MAX_SUPPORT_FILE_SAVE | ERROR_FLASH_FULL)))
  394.                         send_mode |= SEND_DOWN_OK;//状态位置为
  395.         }
  396.         if (flag_connect)//如果当前跟上位机联机状态
  397.         {
  398.                 if (flag_read)//如果上位机读取flash内存储的信息
  399.                 {               
  400.                         if (cur_item.cur_num < motor_one_cmd.end)//判断是否超过之前存储的数
  401.                         {
  402.                                 if ((send_mode & SEND_SEND_FILE))//开始接收到读取命令需要先发送个start
  403.                                 {
  404.                                         UART_PutStr(USART1,"#Start\r\n");
  405.                                         send_mode &= ~SEND_READ_FILE;
  406.                                 }
  407.                                 memset(redata,0,WRITE_SIZE);//清 0
  408.                                 SpiFlashRead((unsigned char *)redata,(((long)cur_item.cur_num)<<WRITE_BIT_DEPTH),WRITE_SIZE);//读取信息
  409. #if DEBUG
  410.                                 sprintf(buf,"%d\r\n",cur_item.cur_num);
  411.                                 UART_PutStr(USART1,buf);
  412. #endif
  413.                                 UART_PutStr(USART1,redata);//发送
  414.                                 cur_item.cur_num++;
  415.                         }
  416.                         else//否则
  417.                         {
  418.                                 if (cur_item.cur_num > 0)
  419.                                         UART_PutStr(USART1,"#End\r\n");//发送结束字符串
  420.                                 flag_read = 0;
  421.                         }
  422.                         send_mode = 0;//请 0
  423.                 }       
  424.                 if (flag_online_run)
  425.                 {
  426.                         if ((send_mode & SEND_CC) != 0  || cur_item.cur_num == motor_one_cmd.start)//如果当前需要更新舵机命令
  427.                         {
  428.                                 if (cur_item.tuoji_count > 0)//脱机次数没结束
  429.                                 {
  430.                                         if (cur_item.cur_num < motor_one_cmd.end)//判断是否读取结束
  431.                                         {
  432.                                                 SpiFlashRead((unsigned char *)redata,((long)cur_item.cur_num)<<WRITE_BIT_DEPTH,WRITE_SIZE);//读取命令
  433.                                                 flag_RecFul = 1;//标志位为1,
  434.                                                 cur_item.cur_num++;//
  435.                                         }
  436.                                         else//执行玩一遍
  437.                                         {
  438.                                                 cur_item.cur_num = motor_one_cmd.start;
  439.                                                 cur_item.tuoji_count--;//减一
  440.                                         }
  441.                                 }
  442.                                 else//执行完成
  443.                                 {
  444.                                         flag_online_run = 0;
  445.                                         if (flag_connect_run)//如果上位机选择执行的功能,需要发送 AGF作为结束
  446.                                         {
  447.                                                 UART_PutStr(USART1,"#AGF\r\n");
  448.                                                 flag_connect_run = 0;
  449.                                         }
  450.                                 }
  451.                                 //读取数据
  452.                         }
  453.                 }
  454.         }
  455.         else//脱机
  456.         {
  457.                 if (file_list_count < 0)
  458.                 {
  459.                         return;
  460.                 }
  461.                 if (cur_item.tuoji_count > 0)
  462.                 {
  463.                         if ((send_mode & SEND_CC) != 0  || cur_item.cur_num == motor_one_cmd.start)//如果当前需要更新舵机命令
  464.                         {
  465.                                 if (cur_item.cur_num < motor_one_cmd.end)//判断是否读取结束
  466.                                 {
  467.                                         SpiFlashRead((unsigned char *)redata,((long)cur_item.cur_num)<<WRITE_BIT_DEPTH,WRITE_SIZE);//读取命令
  468.                                         flag_RecFul = 1;//标志位为1,
  469.                                         cur_item.cur_num++;//
  470.                                 }
  471.                                 else//执行玩一遍
  472.                                 {
  473.                                         cur_item.cur_num = motor_one_cmd.start;
  474.                                         cur_item.tuoji_count--;//减一
  475.                                 }
  476.                                 //读取数据
  477.                         }
  478.                 }
  479.                 else
  480.                 {
  481.                         ReadOneCmdInfor(file_list[cur_item.file_num]);
  482.                         file_list_count--;
  483.                         cur_item.file_num++;
  484.                 }
  485.         }
  486.                
  487.        
  488. }
  489. /***************************************************************************************************************
  490. 函 数 名:发送串口状态信息
  491. 功能描述:根据状态标志位发送相应的信息
  492. 输入参数:无  
  493. 返 回 值:无  
  494. 备    注:
  495. ****************************************************************************************************************/       
  496. void SendUartState(void)
  497. {
  498.   char buf[40] = {0};
  499.         unsigned char read_motor_num = 0;
  500.         unsigned int i = 0;
  501.         static int count = 0;
  502.         if (send_mode)//如果有状态需要发送
  503.         {
  504.                 if (send_mode & SEND_A) //发送A
  505.                 {
  506.                          UART_PutChar(USART1,'A');
  507.                         send_mode &= ~SEND_A;//清状态
  508.                 }
  509.                 if (send_mode & SEND_CC) //发送CC
  510.                 {
  511.                         UART_PutStr(USART1,"#CC\r\n");
  512.                         send_mode &= ~SEND_CC;
  513.                 }
  514.                 if (send_mode & SEND_DOWN_OK)//发送下载ok的状态字符串
  515.                 {
  516.                         sprintf(buf,"#Down+OK+%d\r\n",(int)motor_data.filecount-1);
  517.                         UART_PutStr(USART1,buf);
  518.                         send_mode &= ~SEND_DOWN_OK;
  519. #if DEBUG
  520.                         sprintf(buf,"%d\r\n",(uint)motor_data.filecount);
  521.                         UART_PutStr(USART1,buf);
  522. #endif
  523.                 }
  524.                 if (send_mode & SEND_START_OK)//发送连接时候的字符串
  525.                 {
  526.                         UART_PutStr(USART1,"#Veri+UART+OK+20160906+176\r\n");
  527.                         send_mode &= ~SEND_START_OK;
  528.                 }
  529.                 if (send_mode & SEND_READ_FILE)//发送读取文件的时候字符串
  530.                 {
  531.                         if (motor_data.filecount > 0)//如果保存的有舵机命令
  532.                         {
  533.                                 //#Name:1.txt--Size:48--Name:2.txt--Size:190--Name:desktop.ini--Size:531--
  534.                                 UART_PutStr(USART1,"#");//发送
  535.                                 for (i = 0; i < motor_data.filecount;i++)
  536.                                 {
  537.                                         if (motor_data.file_flag[i] == 1)
  538.                                         {
  539.                                                 ReadOneCmdInfor(i);
  540.                                                 if (motor_one_cmd.end - motor_one_cmd.start <= 0)
  541.                                                 {
  542.                                                         motor_data.file_flag[i] = 0;
  543.                                                         WriteMoterInfor();
  544. #if DEBUG
  545.                                                         sprintf(buf,"E=%d S=%d",motor_one_cmd.end, motor_one_cmd.start);
  546. #endif
  547.                                                 }
  548.                                                 else
  549.                                                 {
  550.                                                         sprintf(buf,"Name:%d.txt--Size:%d--",i,motor_one_cmd.end - motor_one_cmd.start);//获取命令个数
  551.                                                         UART_PutStr(USART1,buf);//发送
  552.                                                 }
  553.                                         }

  554.                                 }
  555.                                 UART_PutStr(USART1,"\r\n");                               
  556.                         }
  557.                         else
  558.                         {
  559.                                 sprintf(buf,"#\r\n",motor_data.sum);
  560.                                 UART_PutStr(USART1,buf);
  561.                         }
  562.                         send_mode &= ~SEND_READ_FILE;
  563.                 }
  564.                 if (send_mode & SEND_SET_OFFLINE_OK)//设置脱机运行次数
  565.                 {
  566.                         WriteOneCmdInfor(motor_one_cmd.cur_file_num);//保存
  567.                         UART_PutStr(USART1,"#Enable+OK...\r\n");
  568.                         send_mode &= ~SEND_SET_OFFLINE_OK;
  569.                 }
  570.                 if (send_mode & SEND_SET_DISABLEOFFLINE_OK)//禁止脱机运行
  571.                 {
  572.                         for (i = 0; i < motor_data.filecount;i++)
  573.                         {
  574.                                 if (motor_data.file_flag[i] == 1)
  575.                                 {
  576.                                         ReadOneCmdInfor(i);
  577.                                         motor_one_cmd.tuoji_count = 0;
  578.                                         WriteOneCmdInfor(i);
  579.                                 }

  580.                         }
  581.                         WriteMoterInfor();
  582.                         UART_PutStr(USART1,"#Disable+OK...\r\n");
  583.                         send_mode &= ~SEND_SET_DISABLEOFFLINE_OK;
  584.                 }
  585.                 if (send_mode & SEND_SET_ONLINE_OK)//发送联机运行状态
  586.                 {
  587.                         UART_PutStr(USART1,"#OK\r\n");
  588.                         sprintf(buf,"#1GC%d\r\n",tuoji_count);
  589.                         UART_PutStr(USART1,buf);
  590.                         UART_PutStr(USART1,"#LP=0\r\n");
  591.                         send_mode &= ~SEND_SET_ONLINE_OK;
  592.                         flag_connect_run = 1;
  593.                 }
  594.                 if (send_mode & SEND_SET_DELETE_ONE_FILE_OK)//发送删除文件命令
  595.                 {
  596.                         //cur_item.tuoji_count = 0;
  597.                         if (cur_item.delete_num < motor_data.filecount)
  598.                         {
  599.                                 motor_data.file_flag[cur_item.delete_num] = 0;
  600.                                 WriteMoterInfor();
  601.                                 updata_file_list();
  602.                                 if (cur_item.delete_num  == motor_data.filecount-1)
  603.                                 {
  604.                                         motor_data.filecount = file_last_num + 1;
  605.                                         if (file_last_num == -1)
  606.                                         {
  607.                                                 motor_data.sum = 0;
  608.                                         }
  609.                                         else
  610.                                         {
  611.                                                 ReadOneCmdInfor(file_last_num);
  612.                                                 motor_data.sum = motor_one_cmd.end;
  613.                                                 motor_data.sum = (((long int)(motor_data.sum) >>4)<<4) + (1<<4);
  614.                                         }
  615.                                         WriteMoterInfor();
  616.                                 }
  617.                                 updata_file_list();               
  618.                                 UART_PutStr(USART1,"#FDel+OK\r\n");
  619.                         }
  620.                         send_mode &= ~SEND_SET_DELETE_ONE_FILE_OK;
  621.                        
  622.                 }
  623.                 if (send_mode & SEND_SET_DELETE_ALL_FILE_OK)//发送擦除所有文件的命令
  624.                 {
  625.                         UART_PutStr(USART1,"#Format+Start\r\n");
  626.                         SpiFlashEraseChip();
  627.                         cur_item.tuoji_count = 0;
  628.                         motor_data.sum = 0;
  629.                         motor_data.filecount = 0;
  630.                         memset(motor_data.file_flag,0,sizeof(motor_data.file_flag));
  631.                         WriteMoterInfor();
  632.                         UART_PutStr(USART1,"#Format+OK\r\n");
  633.                         send_mode &= ~SEND_SET_DELETE_ALL_FILE_OK;
  634.                         updata_file_list();
  635.                 }
  636.                 if (send_mode & SEND_SET_PS2_OK)
  637.                 {
  638.                         UART_PutStr(USART1,"#PS2+OK...\r\n");
  639.                         send_mode &= ~SEND_SET_PS2_OK;
  640.                 }
  641.                
  642. #define MATHION_HAND_NUM 20
  643.                 if (send_mode & SEND_SET_READ_UART_MOTOR_ANGLE)
  644.                 {
  645.                         UART_PutStr(USART1,"\r\n");
  646.                         if (cur_item.read_num < MATHION_HAND_NUM)
  647.                         {
  648.                                 if (flag_uart2_rev)
  649.                                 {
  650.                                         read_motor_num = atoi(uart2_buf + 1);
  651.                                         if (read_motor_num == cur_item.read_num)
  652.                                         {
  653.                                                
  654.                                                 i = atoi(uart2_buf+5);
  655.                                                 sprintf(uart2_buf,"#%dP%d",(int)read_motor_num,i);
  656.                                                 UART_PutStr(USART1,uart2_buf);
  657.                                                 cur_item.read_num++;
  658.                                                 buf[0] = '#';
  659.                                                 buf[1] = cur_item.read_num / 100 % 10 + 0x30;
  660.                                                 buf[2] = cur_item.read_num / 10 % 10 + 0x30;
  661.                                                 buf[3] = cur_item.read_num % 10 + 0x30;
  662.                                                 buf[4] = 'P';buf[5] = 'R';buf[6] = 'A';buf[7] = 'D';buf[8] = '\r';buf[9] = '\n';
  663.                                                 UART_PutStr(USART2,buf);
  664.                                                
  665.                                         }
  666.                                         flag_uart2_rev = 0;
  667.                                         count = 0;
  668.                                        
  669.                                 }
  670.                                 else
  671.                                 {
  672.                                         count++;
  673.                                         if (count >= 10)
  674.                                         {
  675.                                                 cur_item.read_num++;
  676.                                                 buf[0] = '#';
  677.                                                 buf[1] = cur_item.read_num / 100 % 10 + 0x30;
  678.                                                 buf[2] = cur_item.read_num / 10 % 10 + 0x30;
  679.                                                 buf[3] = cur_item.read_num % 10 + 0x30;
  680.                                                 buf[4] = 'P';buf[5] = 'R';buf[6] = 'A';buf[7] = 'D';buf[8] = '\r';buf[9] = '\n';
  681.                                                 UART_PutStr(USART2,buf);
  682.                                                 flag_uart2_rev = 0;
  683.                                                 flag_uart2_rev_time_out = 0;
  684.                                                 count = 0;
  685.                                         }
  686.                                 }
  687.                         }
  688.                         else
  689.                         {
  690.                                 send_mode &= ~SEND_SET_READ_UART_MOTOR_ANGLE;
  691.                                 cur_item.read_num= 0;
  692.                                 UART_PutStr(USART1,"\r\n");
  693.                         }
  694.                 }
  695.         }
  696.         if (send_mode & SEND_SET_SET_UART_MOTOR_PULK)
  697.         {
  698.                 if (cur_item.pulk_num < MATHION_HAND_NUM)
  699.                 {
  700.                         count++;
  701.                         if (count >= 20)
  702.                         {
  703.                                 sprintf(uart2_buf,"#%dPULK\r\n",(int)cur_item.pulk_num);
  704.                                 UART_PutStr(USART2,uart2_buf);
  705. #if DEBUG
  706.                                 UART_PutStr(USART1,uart2_buf);
  707. #endif
  708.                                 cur_item.pulk_num++;
  709.                                 count = 0;
  710.                         }
  711.                 }
  712.                 else
  713.                 {
  714.                         send_mode &= ~SEND_SET_SET_UART_MOTOR_PULK;
  715.                 }
  716.         }
  717.         if (send_mode & SEND_SET_SET_UART_MOTOR_ANGLE)
  718.         {
  719.                 if (cur_item.pulk_num < MATHION_HAND_NUM)
  720.                 {
  721.                         count++;
  722.                         if (count >= 5)
  723.                         {
  724.                                 sprintf(uart2_buf,"#%dPMOD%d\r\n",(int)cur_item.pulk_num,(int)cur_item.angle_mode);
  725.                                 UART_PutStr(USART2,uart2_buf);
  726. #if DEBUG
  727.                                 UART_PutStr(USART1,uart2_buf);
  728. #endif
  729.                                 cur_item.pulk_num++;
  730.                                 count = 0;
  731.                         }
  732.                 }
  733.                 else
  734.                 {
  735.                         sprintf(buf,"#255PMOD%d+0K...\r\n",(int)cur_item.angle_mode);
  736.                         UART_PutStr(USART1,buf);
  737.                         send_mode &= ~SEND_SET_SET_UART_MOTOR_ANGLE;
  738.                         flag_uart2_rev = 0;
  739.                 }
  740.         }
  741.         if (send_mode & SEND_SET_BEEP_ON)
  742.         {
  743.                 ReadMoterInfor();
  744.                 motor_data.beep_mode = 1;
  745.                 //beep_mode = 1;
  746.                 WriteMoterInfor();
  747.                 UART_PutStr(USART1,"#FMQENABLE+OK...\r\n");
  748.                 send_mode &= ~SEND_SET_BEEP_ON;
  749.         }
  750.         if (send_mode & SEND_SET_BEEP_OFF)
  751.         {
  752.                 ReadMoterInfor();
  753.                 motor_data.beep_mode = 0;
  754.                 //beep_mode = 0;
  755.                 WriteMoterInfor();
  756.                 UART_PutStr(USART1,"#FMQDISABLE+OK...\r\n");
  757.                 send_mode &= ~SEND_SET_BEEP_OFF;
  758.         }               
  759. }


  760. /***************************************************************************************************************
  761. 函 数 名:作业初位置,末尾置更新函数  
  762. 功能描述:从缓存中取一个新的目标位置替换原来的目标位置,原来的目标位置变为新的初位置,一次更替
  763.                 :有效的数据是插补增量,和插补次数,知道这两个量,和当前初位置即可
  764. 备    注: 先进先出,循环访问       
  765. ****************************************************************************************************************/       
  766. void change(void)
  767. {       
  768.         unsigned char s;
  769.         if(line>0)                                   //缓存中有数据
  770.         {  
  771.                 line--;                                   //执行一行
  772.                 if(line<5)                        //缓存允许放入新的数据                       
  773.                         flag_in=1;
  774.                 point_now++;                //取数位置更新
  775.                 point_aim++;
  776.                
  777.                 if(point_aim==7)
  778.                            point_aim=0;
  779.                 if(point_now==7)
  780.                            point_now=0;
  781.                 n=pos[point_aim][0]*4/8;        //计算新的插补次数       

  782.                 for(s=1;s<MOTOR_NUM;s++)        //计算新的插补增量
  783.                 {
  784.                  if(pos[point_aim][s]>pos[point_now][s])
  785.                         {
  786.                                    dp=pos[point_aim][s]-pos[point_now][s];
  787.                                    dp0[s]=dp/n;
  788.                         }
  789.                     if(pos[point_aim][s]<=pos[point_now][s])
  790.                         {
  791.                                 dp=pos[point_now][s]-pos[point_aim][s];
  792.                                 dp0[s]=dp/n;
  793.                                 dp0[s]=-dp0[s];
  794.                         }
  795.                                 //UART_Put_Inf("dp:",dp);
  796.                         // UART_Put_Inf("n",n);
  797.                        
  798.            }
  799.                 m=0;                                          //m清0
  800.                 flag_stop=0;                          //产生了新的目标位置,停止标志清零

  801.         }
  802.         else                                                  //没有缓存数据,即line==0
  803.         {
  804.                 flag_out=0;                                //缓存中没有数据
  805.         }
  806. }
  807. /***************************************************************************************************************
  808. 函 数 名:vpwm()  
  809. 功能描述:数据插补,插补时间间隔为20/12ms,由timer0控制,使舵机平滑实现速度控制
  810.                 :另一个功能是执行完一行后去更新下一行数据,即调用change()
  811. 备    注:
  812. ****************************************************************************************************************/       
  813. void vpwm(void)                 
  814. {
  815.         unsigned char j=0;
  816.         unsigned char how=0;
  817.   static unsigned char flag_how;
  818.         static unsigned char flag_Tover;

  819.         if(flag_stop==1)                                           //一行作业全部完成
  820.         {       
  821.                 if(flag_out==1)                                         //缓冲数组中有数据
  822.                 {
  823.                         change();                                        //更新行
  824.                 }
  825.         }
  826.         else                                                                //不是一行数据全部完成,处于中间插补阶段
  827.         {
  828.                 m++;                                                        //用来累加插补过的次数
  829.                 if(m==n)                                                //n是本行作业要插补的总次数
  830.                 {
  831.                   flag_Tover=1;                                //一行数据的执行时间已经完成
  832.                         send_mode |= SEND_CC;
  833.                 }
  834.                 for(j=1;j<MOTOR_NUM;j++)
  835.                 {
  836.                         if(abs(CPWM[j]-pos[point_aim][j])<5)
  837.                         {                                                           //检测靠近终点位置
  838.                            how++;                                           //是,则累加一个
  839.                            CPWM[j]=pos[point_aim][j];//并且直接过度到终点位置
  840.                         }       
  841.                         else                                                //不靠近终点,继续插补
  842.                         {
  843.                                 CPWM[j]=pos[point_now][j]+m*dp0[j];
  844.                         }
  845.                 }
  846.                                                                                                                           
  847.                 if(how==MOTOR_NUM-1)
  848.                         flag_how=1;                                                  //16个舵机都到达终点
  849.                 how=0;
  850.                 if((flag_Tover==1)&&(flag_how==1))
  851.                 {                                                                //从插补次数,和脉宽宽度两方面都到达终点,本作业行完成
  852.                          flag_Tover=0;
  853.                          flag_how=0;
  854.                          flag_stop=1;
  855.                 }
  856.                
  857.          }
  858.         return;

  859. }



  860. /************************************************************************/

  861. #if 0
  862. void SerVor_Test(void)
  863. {
  864.                 CPWM[0]=700;CPWM[1]=700;CPWM[2]=700;CPWM[3]=700;CPWM[4]=700;CPWM[5]=700;
  865.                 Delay_ms(2000);
  866.                 CPWM[0]=2300;CPWM[1]=2300;CPWM[2]=2300;CPWM[3]=2300;CPWM[4]=2300;CPWM[5]=2300;
  867.                 Delay_ms(2000);
  868. }
  869. #endif
  870. #if 0
  871. void Ps2_Test(void)
  872. {
  873.                 key = PS2_DataKey();
  874.                 if(key!=0)
  875.             {
  876.                                 printf("  \r\n   %d  is  pressed  \r\n",key);
  877.             }
  878.      printf(" %5d %5d %5d %5d\r\n",PS2_AnologData(PSS_LX),PS2_AnologData(PSS_LY),
  879.                                               PS2_AnologData(PSS_RX),PS2_AnologData(PSS_RY) );
  880.     Delay_ms(1000);   
  881. }
  882. #endif
  883. #if 1
  884. void Flash_Test(void)
  885. {
  886.                 while(SpiFlashReadID()!=W25Q64)                                                        //检测不到W25Q64
  887.         {
  888.                 UART_PutStr (USART1,"Not Found W25Q64\r\n");
  889.         }
  890.         UART_PutStr (USART1," Found W25Q64\r\n");
  891.         SpiFlashWrite((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);                //从倒数第100个地址写入数据
  892.         UART_PutStr (USART1,"Flash Write Success\r\n");
  893.         SpiFlashRead(datatemp,FLASH_SIZE-100,SIZE);          //读取写入flash中的数据
  894.         UART_PutStr (USART1,datatemp);
  895.         UART_PutStr (USART1,"\r\n Flash Read Success\r\n");
  896.         while(1);
  897. }
  898. #endif
复制代码

所有资料51hei提供下载:
舵机控制器STM32源程序V1.rar (340.32 KB, 下载次数: 43)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:366809 发表于 2019-3-6 09:20 | 只看该作者
楼主有QQ吗,下载了你的程序有一些疑问想请教
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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