找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

BLDC的FOC STM32程序(電流模式與電流模式)資料分享

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:61648 發(fā)表于 2018-11-18 15:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
BLDC 的FOC程序,分享別人的資料


單片機(jī)源程序如下:
  1. /*--------------------------------------------------
  2. 無線串口
  3. uart1與NRF24L01P實現(xiàn)

  4. STM32F103C8T6:
  5.         IO:       
  6.                 PA0~PA15,
  7.                 PB0~PB15,
  8.                 PC13~PC15,
  9.                 PD0~PD1,

  10.         FLASH:        64K
  11.         RAM:        20K                               
  12.                                
  13. 外晶振:4~16MHZ


  14. PA3(ADC12.3):AD_ISC
  15. PA4(ADC12.4):AD_ISB
  16. PA5(ADC12.5):AD_ISA
  17. PA9(TXD1)
  18. PA10(RXD1)
  19. PA7(TIM3.2):PWMA
  20. PB0(TIM3.3):PWMB
  21. PB1(TIM3.4):PWMC


  22. 資源配置:
  23. UART1:
  24. TIM3.2\TIM3.3\TIM3.4:三路PWM,向下計數(shù)模式使PWM后沿對齊,便于同時采樣電流。


  25. 注意:
  26. 工程路徑修改:
  27.   options for target->C/C++->include paths
  28.           ..\FWlib\inc;.\
  29. 兩個點表示上一級目錄,一個點表示與工程相同的目錄

  30. 根據(jù)電流角度直接指定電壓角度,電機(jī)可以反轉(zhuǎn),像電扇的同步電機(jī)一樣


  31. 有必要測量電機(jī)的電感、電阻參數(shù),這樣才能估算反電勢,從而得到轉(zhuǎn)子位置
  32. 關(guān)于轉(zhuǎn)子磁鐵的定位:定子線圈的反電勢過零點處對齊磁鐵
  33. 20181018:發(fā)現(xiàn)獲取電機(jī)L、R參數(shù)時存在問題,指定MOT_AMP后沒加延時,所以參數(shù)不準(zhǔn),反電勢也不準(zhǔn)
  34. 如果參數(shù)準(zhǔn)確,反電勢測量準(zhǔn)確,則在開環(huán)啟動時手捏電機(jī)卡死,則測到的反電勢應(yīng)很小
  35. 轉(zhuǎn)動時的電阻與靜止時的電阻不一樣?
  36. ----------------------------------------------------*/
  37. //--------------------------------------------------
  38. //                頭文件
  39. //--------------------------------------------------
  40. #include "stm32f10x.h"
  41. #include "main.h"
  42. //--------------------------------------------------
  43. #define PWA_H         IOSET(GPIOA->ODR,BIT(7))
  44. #define PWA_L         IOCLR(GPIOA->ODR,BIT(7))
  45. #define PWA_XOR        IOXOR(GPIOA->ODR,BIT(7))
  46. #define PWB_H         IOSET(GPIOB->ODR,BIT(0))
  47. #define PWB_L         IOCLR(GPIOB->ODR,BIT(0))
  48. #define PWB_XOR        IOXOR(GPIOB->ODR,BIT(0))
  49. #define PWC_H         IOSET(GPIOB->ODR,BIT(1))
  50. #define PWC_L         IOCLR(GPIOB->ODR,BIT(1))
  51. #define PWC_XOR        IOXOR(GPIOB->ODR,BIT(1))

  52. #define PTEST_H         IOSET(GPIOA->ODR,BIT(2))
  53. #define PTEST_L         IOCLR(GPIOA->ODR,BIT(2))
  54. #define PTEST_XOR        IOXOR(GPIOA->ODR,BIT(2))

  55. //--------------------------------------------------

  56. U16 mainflag=0;
  57. enum {
  58. FLAG_START=BIT(0),
  59. FLAG_RUN=BIT(1)
  60. };


  61. void delayus(U32 t);
  62. U8         myatan(S16 x,S16 y);
  63. U16 GetRegAdc(U8 ch);
  64. //U16        DMA_ADCBuf[DMA_ADCBUFSIZE];
  65. //--------------------------------------------------
  66. //                聲明
  67. //--------------------------------------------------
  68. #include "MOTFOC.C"
  69. #include "uart.c"
  70. #include "stm32f10x_it.c"
  71. //--------------------------------------------------
  72. //        短延時
  73. //--------------------------------------------------
  74. void delay(__IO uint32_t nCount)
  75. {
  76.   for(; nCount != 0; nCount--);
  77. }
  78. //--------------------------------------------------
  79. //        微秒延時
  80. //--------------------------------------------------
  81. void delayus(U32 t)
  82. {
  83.         U32 i;
  84.         for(;t;t--)
  85.         {
  86.                 for(i=8;i;i--);
  87.         }
  88. }
  89. //--------------------------------------------------
  90. //        毫秒延時
  91. //--------------------------------------------------
  92. void delayms(U32 t)
  93. {
  94.         U32 i;
  95.         while(t--)
  96.         {
  97.                 for(i=FOSC/4800;i>0;i--);
  98.         }
  99. }
  100. //--------------------------------------------------
  101. //電機(jī)發(fā)聲
  102. //--------------------------------------------------
  103. /*void Beep(U8 m,U8 t)
  104. {
  105.         U16 i,t1;

  106.         if(m==0)return;
  107.         i=1000/m;
  108.         t1=(i+100)*t*m/10;
  109.         while(t1--)
  110.         {
  111.                 BEEP_L;
  112.                 delayus(100);
  113.                 BEEP_H;
  114.                 delayus(i);
  115.         }
  116. }*/
  117. /*
  118. void Beep(U8 m,U8 t)
  119. {
  120.         U16 t1;
  121.         t1=6000/(m+6);
  122.         beep_td=t;
  123.         if(m)
  124.         {
  125.                 TIM_SetAutoreload(TIM4,t1);
  126.                 TIM_SetCompare1(TIM4,50);
  127.         }       
  128. }
  129. //等待鳴響完成
  130. void BeepW(U8 m,U8 t)
  131. {
  132.         Beep(m,t);
  133.         while(beep_td);
  134. }
  135. */
  136. //--------------------------------------------------
  137. //ADC初始化
  138. //--------------------------------------------------
  139. void ADC_Conf(void)
  140. {
  141.         ADC_InitTypeDef ADC_InitStructure;
  142.         //DMA_InitTypeDef DMA_InitStructure;

  143.         //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2的RCC時鐘       
  144.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2, ENABLE);        // Enable ADC1 and GPIOC clock
  145.         ADC_InitStructure.ADC_Mode =ADC_Mode_Independent;//獨立模式 ADC_Mode_RegSimult;//規(guī)則同步模式//
  146.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;//ENABLE;//掃描模式?
  147.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//單次模式//ENABLE;//連續(xù)模式
  148.         ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None;//由軟件觸發(fā),不由外部觸發(fā) ADC_ExternalTrigConv_T2_CC2; //ADC_ExternalTrigConv_T2_CC2;//定時器2的CC2觸發(fā)//
  149.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右對齊
  150.         ADC_InitStructure.ADC_NbrOfChannel = 1;
  151.         ADC_Init(ADC1, &ADC_InitStructure);
  152.         // ADC1 regular channel14 configuration
  153.         ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_1Cycles5);
  154.         ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_1Cycles5);
  155.         ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_1Cycles5);       
  156.        
  157.         //ADC_InjectedSequencerLengthConfig(ADC1, 1);//設(shè)置注入通道長度
  158.         //ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_13Cycles5);//注入組為一個ADC3
  159.         //ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//不用外觸發(fā)
  160.         //ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//開始注入通道數(shù)據(jù)采樣和轉(zhuǎn)換
  161.        
  162.         // Enable ADC1 DMA
  163.         //ADC_DMACmd(ADC1, ENABLE);//使能DMA       
  164.           //ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能外部觸發(fā)  
  165.         // Enable ADC1
  166.         ADC_Cmd(ADC1, ENABLE);//啟動一次轉(zhuǎn)換?
  167.         // Enable ADC1 reset calibaration register   
  168.         ADC_ResetCalibration(ADC1);//重置指定ADC的校準(zhǔn)寄存器
  169.         //Check the end of ADC1 reset calibration register
  170.         while(ADC_GetResetCalibrationStatus(ADC1));       
  171.         // Start ADC1 calibaration
  172.         ADC_StartCalibration(ADC1);
  173.         // Check the end of ADC1 calibration
  174.         while(ADC_GetCalibrationStatus(ADC1));       
  175.         // Start ADC1 Software Conversion
  176.         //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能軟件轉(zhuǎn)換啟動
  177.         ADC_Cmd(ADC1, ENABLE);//啟動一次轉(zhuǎn)換?
  178. }       
  179. //--------------------------------------------------
  180. //取得規(guī)則組ADC值
  181. //--------------------------------------------------
  182. U16 GetRegAdc(U8 ch)
  183. {
  184.         U16 r;
  185.         r=ADC1->SQR3;//規(guī)則組第一次轉(zhuǎn)換通道在SQR3低0~4位
  186.         r=(r&0xffe0)|ch;
  187.         ADC1->SQR3=r;
  188.         //ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_7Cycles5);
  189.           ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  190.         while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
  191.         return ADC_GetConversionValue(ADC1);
  192. }
  193. //--------------------------------------------------
  194. //等待采集完數(shù)據(jù)后發(fā)送給上位機(jī)顯示波形
  195. //--------------------------------------------------
  196. void SendADbuf(void)
  197. {
  198.         S16 i;
  199.         while(ad_p<ADCBUFSIZE);
  200.         for(i=0;i<ADCBUFSIZE;i++)
  201.         {                       
  202.                 UART1_SendByte(0xaa);
  203.                 UART1_SendByte(10);
  204.                 UART1_SendByte(adbuf[0][i]>>8);
  205.                 UART1_SendByte(adbuf[0][i]);       
  206.                 UART1_SendByte(adbuf[1][i]>>8);
  207.                 UART1_SendByte(adbuf[1][i]);       
  208.                 UART1_SendByte(adbuf[2][i]>>8);
  209.                 UART1_SendByte(adbuf[2][i]);
  210.                 UART1_SendByte(adbuf[3][i]>>8);
  211.                 UART1_SendByte(adbuf[3][i]);
  212.                 UART1_SendByte(adbuf[4][i]>>8);
  213.                 UART1_SendByte(adbuf[4][i]);                                               
  214.         }
  215. }

  216. //--------------------------------------------------
  217. //        IO口初始化
  218. //--------------------------------------------------
  219. void io_init(void)
  220. {
  221.         GPIO_InitTypeDef GPIO_InitStructure;

  222.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |         RCC_APB2Periph_GPIOB
  223.         |RCC_APB2Periph_AFIO,ENABLE);                //使能外設(shè)時鐘//AFIO用于REMAP
  224.        
  225.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//某些引腳需重映射
  226.         //GPIO_PinRemapConfig(GPIO_Remap_SPI1,DISABLE);       
  227.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  228. /*
  229.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  230.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  231.         GPIO_InitStructure.GPIO_Pin = BIT(5)|BIT(7);//SPI1_SCK,SPI1_MOSI       
  232.         GPIO_Init(GPIOA, &GPIO_InitStructure);        */
  233.         //AD_ISA,AD_ISB,AD_ISC
  234.         GPIO_InitStructure.GPIO_Pin = BIT(5)|BIT(4)|BIT(3);
  235.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  236.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  237.         //PWMA
  238.         GPIO_InitStructure.GPIO_Pin = BIT(7);//
  239.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;// GPIO_Mode_Out_PP;
  240.         GPIO_Init(GPIOA, &GPIO_InitStructure);       
  241.         //PTEST
  242.         GPIO_InitStructure.GPIO_Pin = BIT(2);//
  243.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
  244.         GPIO_Init(GPIOA, &GPIO_InitStructure);       
  245.         //PWMB,PWMC
  246.         GPIO_InitStructure.GPIO_Pin = BIT(1)|BIT(0);
  247.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_Out_PP;
  248.         GPIO_Init(GPIOB, &GPIO_InitStructure);               

  249. }

  250. //--------------------------------------------------
  251. //                定時器初始化
  252. //APB1=56M/2=28M
  253. //TIM2用于觸發(fā)ADC
  254. //TIM3用于定時處理(10KHz)
  255. //TIM4_CH1:蜂鳴器
  256. //--------------------------------------------------
  257. void Timer_Init(void)
  258. {
  259.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  260.         TIM_OCInitTypeDef        TIM_OCInitStructure;       
  261.        
  262.         TIM_TimeBaseStructure.TIM_Period= 256-1;                        //自動重裝值,為0時不工作
  263.         TIM_TimeBaseStructure.TIM_Prescaler= 10-1;                //時鐘頻率預(yù)分頻(變?yōu)?M)
  264.         //向上計數(shù):0~TIM_Period                向下計數(shù):TIM_Period~0
  265.         //TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;        //向上計數(shù)模式
  266.         TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Down;        //向下計數(shù)模式       
  267.         TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1;        //時鐘分頻因子
  268.        
  269.        
  270.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能TIM3的RCC時鐘               
  271.         TIM_DeInit(TIM3);
  272.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  273.         TIM_InternalClockConfig(TIM3);//由內(nèi)部提供時鐘.
  274.        
  275.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能更新事件中斷       
  276.         TIM_Cmd(TIM3,ENABLE);        //使能定時器
  277.        
  278.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCMode_Toggle// 輸出比較觸發(fā)模式  
  279.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//貌似必須設(shè)置為輸出才行
  280.         TIM_OCInitStructure.TIM_Pulse = 100;//
  281.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  282.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  283.         TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  284.         TIM_OC4Init(TIM3, &TIM_OCInitStructure);       
  285.        
  286.         TIM3->CCR2=0;
  287.         TIM3->CCR3=40;
  288.         TIM3->CCR4=255;
  289.         //TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
  290.         //TIM_PrescalerConfig(TIM2,1,TIM_PSCReloadMode_Immediate);//立即裝入預(yù)分頻
  291.         //TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//使能TIM2捕獲\比較中斷       
  292. }

  293. //--------------------------------------------------
  294. //        NVIC初始化
  295. //--------------------------------------------------
  296. void NVIC_Configuration(void)
  297. {
  298.         NVIC_InitTypeDef NVIC_InitStructure;
  299.         //EXTI_InitTypeDef EXTI_InitStructure;
  300.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  301.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//占先
  302.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //

  303.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;   //選擇TIM3中斷
  304.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//
  305.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //
  306.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能       
  307.         NVIC_Init(&NVIC_InitStructure);
  308.        
  309.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//占先
  310.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  311.         NVIC_Init(&NVIC_InitStructure);

  312.        
  313. }
  314. //--------------------------------------------------
  315. //使用HSI:8/2*16=64MHZ
  316. //--------------------------------------------------
  317. void RCC_Configuration(void)
  318. {
  319.         RCC_DeInit();
  320.        
  321.         RCC_HSICmd(ENABLE);
  322.        
  323.         while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
  324.         {
  325.        
  326.         }

  327.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  
  328.         FLASH_SetLatency(FLASH_Latency_2);  
  329.         RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB時鐘為系統(tǒng)時鐘SYSCLK  
  330.         RCC_PCLK2Config(RCC_HCLK_Div1);  //APB1時鐘為HCLK/2,其中HCLK為AHB時鐘  
  331.         RCC_PCLK1Config(RCC_HCLK_Div2);  //APB2時鐘為HCLK  
  332.         //設(shè)置 PLL 時鐘源及倍頻系數(shù)  
  333.         RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);  //8/2*16=64MHZ
  334.         //使能或者失能 PLL,這個參數(shù)可以。篍NABLE或者DISABLE  
  335.         RCC_PLLCmd(ENABLE);//如果PLL被用于系統(tǒng)時鐘,那么它不能被失能  
  336.         //等待指定的 RCC 標(biāo)志位設(shè)置成功 等待PLL初始化成功  
  337.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  338.         {
  339.        
  340.         }
  341.         //設(shè)置系統(tǒng)時鐘(SYSCLK) 設(shè)置PLL為系統(tǒng)時鐘源  
  342.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  343.         //等待PLL成功用作于系統(tǒng)時鐘的時鐘源     
  344.         // 0x00:HSI 作為系統(tǒng)時鐘  
  345.         // 0x04:HSE作為系統(tǒng)時鐘  
  346.         // 0x08:PLL作為系統(tǒng)時鐘  
  347.         while(RCC_GetSYSCLKSource() != 0x08)
  348.         {
  349.        
  350.         }  
  351.         //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
  352.         //RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
  353. }
  354. //--------------------------------------------------
  355. //        初始化所有的設(shè)備
  356. //--------------------------------------------------
  357. void init_devices(void)
  358. {
  359.         //SystemInit();
  360.         RCC_Configuration();
  361.         io_init();
  362.         UART_Config(38400);
  363.         Timer_Init();
  364.         ADC_Conf();
  365.         NVIC_Configuration();       
  366.         delayms(100);
  367.         //LCD_Init();       
  368. }
  369. //--------------------------------------------------
  370. //        主函數(shù)
  371. //--------------------------------------------------
  372. int main(void)
  373. {
  374.         S16 i=1,u,v,w,x,y;
  375.         U8 p;
  376.         init_devices();       
  377.         /*
  378.         //------------------------------myatan驗證
  379.         for(i=0;i<256;i++)//一周期
  380.         {
  381.                 p=i;
  382.                 u=costab[p];
  383.                 p-=256/3;//360度/3=120度
  384.                 v=costab[p];
  385.                 p-=256/3;//360度/3=120度
  386.                 w=costab[p];       
  387.                        
  388.                 x=myatan(u,v);
  389.                 UART1_SendByte(0xaa);
  390.                 UART1_SendByte(8);
  391.                 UART1_SendByte(u>>8);
  392.                 UART1_SendByte(u);       
  393.                 UART1_SendByte(v>>8);
  394.                 UART1_SendByte(v);
  395.                 UART1_SendByte(w>>8);
  396.                 UART1_SendByte(w);                       
  397.                 UART1_SendByte(x>>8);
  398.                 UART1_SendByte(x);               
  399.         }
  400.         //------------------------------Clarke變換驗證       
  401.         for(i=0;i<256;i++)//一周期
  402.         {
  403.                 p=i;
  404.                 u=costab[p];
  405.                 p-=256/3;//360度/3=120度
  406.                 v=costab[p];
  407.                 ClarkeTrans(u,v,&x,&y);
  408.                 x+=10;//偏移10以免波形重疊
  409.                 y+=10;
  410.                 UART1_SendByte(0xaa);
  411.                 UART1_SendByte(8);
  412.                 UART1_SendByte(u>>8);
  413.                 UART1_SendByte(u);       
  414.                 UART1_SendByte(v>>8);
  415.                 UART1_SendByte(v);       
  416.                 UART1_SendByte(x>>8);
  417.                 UART1_SendByte(x);
  418.                 UART1_SendByte(y>>8);
  419.                 UART1_SendByte(y);                               
  420.         }
  421.         //------------------------------Clarke逆變換驗證       
  422.         for(i=0;i<256;i++)//一周期
  423.         {
  424.                 p=i;
  425.                 u=costab[p];
  426.                 p-=256/3;//360度/3=120度
  427.                 v=costab[p];
  428.                 ClarkeTrans(u,v,&x,&y);
  429.                 ClarkeInvTrans(x,y,&u,&v,&w);
  430.                 x+=10;//偏移10以免波形重疊
  431.                 y+=10;
  432.                 UART1_SendByte(0xaa);
  433.                 UART1_SendByte(8);
  434.                 UART1_SendByte(u>>8);
  435.                 UART1_SendByte(u);       
  436.                 UART1_SendByte(v>>8);
  437.                 UART1_SendByte(v);       
  438.                 UART1_SendByte(x>>8);
  439.                 UART1_SendByte(x);
  440.                 UART1_SendByte(y>>8);
  441.                 UART1_SendByte(y);                               
  442.         }
  443.         //------------------------------Park變換驗證       
  444.         for(i=0;i<256;i++)//一周期
  445.         {
  446.                 p=0;//u\v固定為0度
  447.                 u=costab[p];
  448.                 p-=256/4;//360度/4=90度
  449.                 v=costab[p];
  450.                 ParkTrans(u,v,i,&x,&y);//Park變換(旋轉(zhuǎn)i度(2PI=256))
  451.                 UART1_SendByte(0xaa);
  452.                 UART1_SendByte(8);
  453.                 UART1_SendByte(u>>8);
  454.                 UART1_SendByte(u);       
  455.                 UART1_SendByte(v>>8);
  456.                 UART1_SendByte(v);       
  457.                 UART1_SendByte(x>>8);
  458.                 UART1_SendByte(x);
  459.                 UART1_SendByte(y>>8);
  460.                 UART1_SendByte(y);                               
  461.         }
  462.         //i=1;
  463.         //while(i);
  464.         delayms(3000);// */
  465.         //------------------------------電流校零
  466.         Mot_State=0;
  467.         delayms(10);
  468.         Mot_State=1;
  469.         delayms(10);//等待電流校零
  470.         //------------------------------獲取電機(jī)參數(shù)
  471.         //指定相電壓
  472.         Mot_AMP=(7*256/47);//需要0.5V,電源4.7V       
  473.         Mot_State=2;//取得電機(jī)參數(shù)
  474.         delayms(100);//由于電機(jī)會略有轉(zhuǎn)動,等長一點時間后重新采集數(shù)據(jù)
  475.         Mot_State=0;//停止
  476.         delayms(1);        //等到續(xù)流為0后再開始采集
  477.         ad_p=0;//開始采集數(shù)據(jù)
  478.         Mot_State=2;//取得電機(jī)參數(shù)       
  479.         delayms(100);//iu=0,42,68,...,109
  480.         while(ad_p<ADCBUFSIZE);//等數(shù)據(jù)采集完       

  481.         Mot_State=0;
  482.         if(adbuf[0][1]==adbuf[0][0])//防止除數(shù)為0       
  483.                 adbuf[0][1]=adbuf[0][0]+1;
  484.         Mot_L=(U16)Mot_AMP*100/(adbuf[0][1]-adbuf[0][0]);//表示pwm=1時每周期的電流增量*100       
  485.         Mot_R=(U16)Mot_AMP*100/adbuf[0][ADCBUFSIZE-1];//表示PWM每變化1時電流的變化量*100       
  486.         adbuf[3][ADCBUFSIZE-1]=Mot_L;//在上位機(jī)中查看此數(shù)據(jù)
  487.         adbuf[4][ADCBUFSIZE-1]=Mot_R;
  488.         /*
  489.         SendADbuf();//發(fā)給上位機(jī)查看波形
  490.        
  491.         //------------------------------驗證電感、電阻計算公式       
  492.         Mot_AMP=(5*256/47);//相電壓0.5V       
  493.         Mot_State=2;//取得電機(jī)參數(shù)
  494.         delayms(50);//由于電機(jī)會略有轉(zhuǎn)動,等長一點時間后重新采集數(shù)據(jù)
  495.         Mot_State=0;//停止
  496.         delayms(1);       
  497.         ad_p=0;//開始采集數(shù)據(jù)
  498.         Mot_State=2;//取得電機(jī)參數(shù)       
  499.         delayms(20);//iu=0,42,68,...,109       
  500.         Mot_State=0;
  501.         SendADbuf();// */       

  502.         //------------------------------
  503.         Mot_State=0;
  504.         delayms(1);       
  505.         //------------------------------開環(huán)啟動
  506.         Mot_AMP=45;
  507.         ad_p=0;
  508.         Mot_State=3;//開環(huán)啟動       
  509.         SendADbuf();
  510.         delayms(1000);
  511.         ad_p=0;
  512.         SendADbuf();
  513.        
  514.         ad_p=0;
  515.         while(ad_p<ADCBUFSIZE/3);
  516.         Mot_State=4;//開始閉環(huán)
  517.         SendADbuf();       
  518.         while(1)
  519.         {                               
  520.                 ad_p=0;
  521.                 SendADbuf();       
  522.                 delayms(2000);                       
  523.         }
  524. /*        while(1)//調(diào)壓
  525.         {
  526.                 Mot_AMP=50;delayms(2000);
  527.                 ad_p=0;
  528.                 SendADbuf();
  529.                 Mot_AMP=150;delayms(2000);
  530.                 ad_p=0;
  531.                 SendADbuf();                       
  532.         }        */
  533. }

  534. #ifdef  USE_FULL_ASSERT
  535. /**
  536.   * @brief  Reports the name of the source file and the source line number
  537.   *   where the assert_param error has occurred.
  538.   * @param file: pointer to the source file name
  539.   * @param line: assert_param error line source number
  540.   * @retval : None
  541.   */
  542. void assert_failed(uint8_t* file, uint32_t line)
  543. {
  544.   /* User can add his own implementation to report the file name and line number,
  545.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  546.   /* Infinite loop */
  547.   while (1){}
  548. }
  549. #endif
復(fù)制代碼

所有資料51hei提供下載:
程序.rar (878.55 KB, 下載次數(shù): 393)


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

使用道具 舉報

沙發(fā)
ID:428818 發(fā)表于 2018-11-18 19:46 | 只看該作者
不錯,玩轉(zhuǎn)正弦波電機(jī)控制器有市場
回復(fù)

使用道具 舉報

板凳
ID:391224 發(fā)表于 2018-11-29 11:19 | 只看該作者
不錯有用
回復(fù)

使用道具 舉報

地板
ID:398192 發(fā)表于 2018-12-2 16:53 | 只看該作者
非常不錯的程序
回復(fù)

使用道具 舉報

5#
ID:239046 發(fā)表于 2019-5-6 16:22 | 只看該作者
樓主驅(qū)動用的是3個mos嗎,能發(fā)下原理圖嗎,我的qq:1547155774
回復(fù)

使用道具 舉報

6#
ID:239046 發(fā)表于 2019-5-6 16:23 | 只看該作者
666,高大上
回復(fù)

使用道具 舉報

7#
ID:537360 發(fā)表于 2019-5-13 20:21 | 只看該作者
感覺還不錯,準(zhǔn)備下載下看看。
回復(fù)

使用道具 舉報

8#
ID:433408 發(fā)表于 2019-5-14 14:18 | 只看該作者
很厲害,想問一下這個波形是用什么軟件仿真出來的?
回復(fù)

使用道具 舉報

9#
ID:433408 發(fā)表于 2019-5-14 14:36 | 只看該作者
這是自己寫的FOC代碼嗎,非常厲害!
問一下你這個波形是什么軟件,怎么仿真出來的,謝謝了!
回復(fù)

使用道具 舉報

10#
ID:316641 發(fā)表于 2019-7-23 23:41 | 只看該作者
收藏了,謝謝分享,回頭好好看看
回復(fù)

使用道具 舉報

11#
ID:122762 發(fā)表于 2019-7-31 23:25 | 只看該作者
666,感謝樓主分享!
回復(fù)

使用道具 舉報

12#
ID:441868 發(fā)表于 2019-8-14 15:48 | 只看該作者
確實值得借鑒,感謝
回復(fù)

使用道具 舉報

13#
ID:99570 發(fā)表于 2019-9-11 10:54 | 只看該作者
不錯哦,正弦波好東西呀!
回復(fù)

使用道具 舉報

14#
ID:324611 發(fā)表于 2019-9-18 14:31 | 只看該作者
大神,學(xué)習(xí)了。
回復(fù)

使用道具 舉報

15#
ID:409504 發(fā)表于 2019-11-30 11:58 | 只看該作者
感謝大佬分享                 
回復(fù)

使用道具 舉報

16#
ID:287451 發(fā)表于 2019-12-17 17:03 | 只看該作者
你好,請問一下這個串口上位機(jī)能給一下源碼嗎??
回復(fù)

使用道具 舉報

17#
ID:287451 發(fā)表于 2019-12-21 14:45 | 只看該作者
看了代碼,沒有整明白你的思路
回復(fù)

使用道具 舉報

18#
ID:253262 發(fā)表于 2019-12-30 20:11 | 只看該作者
樓主好厲害啊 FOC學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

19#
ID:287451 發(fā)表于 2020-1-2 22:28 | 只看該作者
你好,這個波形你什么工具顯示的
回復(fù)

使用道具 舉報

20#
ID:136769 發(fā)表于 2020-1-15 16:10 | 只看該作者
很好,很棒
回復(fù)

使用道具 舉報

21#
ID:635223 發(fā)表于 2020-2-12 15:48 | 只看該作者
很實用,現(xiàn)在正好在學(xué)習(xí)這個東西,非常感謝
回復(fù)

使用道具 舉報

22#
ID:294296 發(fā)表于 2020-2-12 16:39 | 只看該作者
感謝樓主,,太厲害了,很好的資料,我用方波電機(jī)都轉(zhuǎn)不穩(wěn)
回復(fù)

使用道具 舉報

23#
ID:334249 發(fā)表于 2020-6-13 14:54 | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報

24#
ID:384489 發(fā)表于 2021-8-30 14:47 | 只看該作者
學(xué)習(xí)BLDC中,不錯的資料。
回復(fù)

使用道具 舉報

25#
ID:6656 發(fā)表于 2021-8-30 15:02 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

26#
ID:430872 發(fā)表于 2022-3-29 10:08 | 只看該作者
最近正在學(xué)習(xí)中~~·找找前輩們的資料學(xué)習(xí)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表