找回密码
 立即注册

QQ登录

只需一步,快速开始

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

BLDC的FOC STM32程序(电流模式与电流模式)资料分享

  [复制链接]
跳转到指定楼层
楼主
BLDC 的FOC程序,分享别人的资料


单片机源程序如下:
  1. /*--------------------------------------------------
  2. 无线串口
  3. uart1与NRF24L01P实现

  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,向下计数模式使PWM后沿对齐,便于同时采样电流。


  25. 注意:
  26. 工程路径修改:
  27.   options for target->C/C++->include paths
  28.           ..\FWlib\inc;.\
  29. 两个点表示上一级目录,一个点表示与工程相同的目录

  30. 根据电流角度直接指定电压角度,电机可以反转,像电扇的同步电机一样


  31. 有必要测量电机的电感、电阻参数,这样才能估算反电势,从而得到转子位置
  32. 关于转子磁铁的定位:定子线圈的反电势过零点处对齐磁铁
  33. 20181018:发现获取电机L、R参数时存在问题,指定MOT_AMP后没加延时,所以参数不准,反电势也不准
  34. 如果参数准确,反电势测量准确,则在开环启动时手捏电机卡死,则测到的反电势应很小
  35. 转动时的电阻与静止时的电阻不一样?
  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. //电机发声
  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;//规则同步模式//
  146.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;//ENABLE;//扫描模式?
  147.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次模式//ENABLE;//连续模式
  148.         ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None;//由软件触发,不由外部触发 ADC_ExternalTrigConv_T2_CC2; //ADC_ExternalTrigConv_T2_CC2;//定时器2的CC2触发//
  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);//设置注入通道长度
  158.         //ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_13Cycles5);//注入组为一个ADC3
  159.         //ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//不用外触发
  160.         //ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//开始注入通道数据采样和转换
  161.        
  162.         // Enable ADC1 DMA
  163.         //ADC_DMACmd(ADC1, ENABLE);//使能DMA       
  164.           //ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能外部触发  
  165.         // Enable ADC1
  166.         ADC_Cmd(ADC1, ENABLE);//启动一次转换?
  167.         // Enable ADC1 reset calibaration register   
  168.         ADC_ResetCalibration(ADC1);//重置指定ADC的校准寄存器
  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);//使能软件转换启动
  177.         ADC_Cmd(ADC1, ENABLE);//启动一次转换?
  178. }       
  179. //--------------------------------------------------
  180. //取得规则组ADC值
  181. //--------------------------------------------------
  182. U16 GetRegAdc(U8 ch)
  183. {
  184.         U16 r;
  185.         r=ADC1->SQR3;//规则组第一次转换通道在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. //等待采集完数据后发送给上位机显示波形
  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);                //使能外设时钟//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用于触发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;                //时钟频率预分频(变为1M)
  264.         //向上计数:0~TIM_Period                向下计数:TIM_Period~0
  265.         //TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Up;        //向上计数模式
  266.         TIM_TimeBaseStructure.TIM_CounterMode= TIM_CounterMode_Down;        //向下计数模式       
  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);//由内部提供时钟.
  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// 输出比较触发模式  
  279.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//貌似必须设置为输出才行
  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);//立即装入预分频
  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时钟为系统时钟SYSCLK  
  330.         RCC_PCLK2Config(RCC_HCLK_Div1);  //APB1时钟为HCLK/2,其中HCLK为AHB时钟  
  331.         RCC_PCLK1Config(RCC_HCLK_Div2);  //APB2时钟为HCLK  
  332.         //设置 PLL 时钟源及倍频系数  
  333.         RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);  //8/2*16=64MHZ
  334.         //使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE  
  335.         RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能  
  336.         //等待指定的 RCC 标志位设置成功 等待PLL初始化成功  
  337.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  338.         {
  339.        
  340.         }
  341.         //设置系统时钟(SYSCLK) 设置PLL为系统时钟源  
  342.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  343.         //等待PLL成功用作于系统时钟的时钟源     
  344.         // 0x00:HSI 作为系统时钟  
  345.         // 0x04:HSE作为系统时钟  
  346.         // 0x08:PLL作为系统时钟  
  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. //        初始化所有的设备
  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. //        主函数
  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变换(旋转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.         //------------------------------获取电机参数
  471.         //指定相电压
  472.         Mot_AMP=(7*256/47);//需要0.5V,电源4.7V       
  473.         Mot_State=2;//取得电机参数
  474.         delayms(100);//由于电机会略有转动,等长一点时间后重新采集数据
  475.         Mot_State=0;//停止
  476.         delayms(1);        //等到续流为0后再开始采集
  477.         ad_p=0;//开始采集数据
  478.         Mot_State=2;//取得电机参数       
  479.         delayms(100);//iu=0,42,68,...,109
  480.         while(ad_p<ADCBUFSIZE);//等数据采集完       

  481.         Mot_State=0;
  482.         if(adbuf[0][1]==adbuf[0][0])//防止除数为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;//在上位机中查看此数据
  487.         adbuf[4][ADCBUFSIZE-1]=Mot_R;
  488.         /*
  489.         SendADbuf();//发给上位机查看波形
  490.        
  491.         //------------------------------验证电感、电阻计算公式       
  492.         Mot_AMP=(5*256/47);//相电压0.5V       
  493.         Mot_State=2;//取得电机参数
  494.         delayms(50);//由于电机会略有转动,等长一点时间后重新采集数据
  495.         Mot_State=0;//停止
  496.         delayms(1);       
  497.         ad_p=0;//开始采集数据
  498.         Mot_State=2;//取得电机参数       
  499.         delayms(20);//iu=0,42,68,...,109       
  500.         Mot_State=0;
  501.         SendADbuf();// */       

  502.         //------------------------------
  503.         Mot_State=0;
  504.         delayms(1);       
  505.         //------------------------------开环启动
  506.         Mot_AMP=45;
  507.         ad_p=0;
  508.         Mot_State=3;//开环启动       
  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;//开始闭环
  517.         SendADbuf();       
  518.         while(1)
  519.         {                               
  520.                 ad_p=0;
  521.                 SendADbuf();       
  522.                 delayms(2000);                       
  523.         }
  524. /*        while(1)//调压
  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
复制代码

所有资料51hei提供下载:
程序.rar (878.55 KB, 下载次数: 380)


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

使用道具 举报

沙发
ID:428818 发表于 2018-11-18 19:46 | 只看该作者
不错,玩转正弦波电机控制器有市场
回复

使用道具 举报

板凳
ID:391224 发表于 2018-11-29 11:19 | 只看该作者
不错有用
回复

使用道具 举报

地板
ID:398192 发表于 2018-12-2 16:53 | 只看该作者
非常不错的程序
回复

使用道具 举报

5#
ID:239046 发表于 2019-5-6 16:22 | 只看该作者
楼主驱动用的是3个mos吗,能发下原理图吗,我的qq:1547155774
回复

使用道具 举报

6#
ID:239046 发表于 2019-5-6 16:23 | 只看该作者
666,高大上
回复

使用道具 举报

7#
ID:537360 发表于 2019-5-13 20:21 | 只看该作者
感觉还不错,准备下载下看看。
回复

使用道具 举报

8#
ID:433408 发表于 2019-5-14 14:18 | 只看该作者
很厉害,想问一下这个波形是用什么软件仿真出来的?
回复

使用道具 举报

9#
ID:433408 发表于 2019-5-14 14:36 | 只看该作者
这是自己写的FOC代码吗,非常厉害!
问一下你这个波形是什么软件,怎么仿真出来的,谢谢了!
回复

使用道具 举报

10#
ID:316641 发表于 2019-7-23 23:41 | 只看该作者
收藏了,谢谢分享,回头好好看看
回复

使用道具 举报

11#
ID:122762 发表于 2019-7-31 23:25 | 只看该作者
666,感谢楼主分享!
回复

使用道具 举报

12#
ID:441868 发表于 2019-8-14 15:48 | 只看该作者
确实值得借鉴,感谢
回复

使用道具 举报

13#
ID:99570 发表于 2019-9-11 10:54 | 只看该作者
不错哦,正弦波好东西呀!
回复

使用道具 举报

14#
ID:324611 发表于 2019-9-18 14:31 | 只看该作者
大神,学习了。
回复

使用道具 举报

15#
ID:409504 发表于 2019-11-30 11:58 | 只看该作者
感谢大佬分享                 
回复

使用道具 举报

16#
ID:287451 发表于 2019-12-17 17:03 | 只看该作者
你好,请问一下这个串口上位机能给一下源码吗??
回复

使用道具 举报

17#
ID:287451 发表于 2019-12-21 14:45 | 只看该作者
看了代码,没有整明白你的思路
回复

使用道具 举报

18#
ID:253262 发表于 2019-12-30 20:11 | 只看该作者
楼主好厉害啊 FOC学习学习
回复

使用道具 举报

19#
ID:287451 发表于 2020-1-2 22:28 | 只看该作者
你好,这个波形你什么工具显示的
回复

使用道具 举报

20#
ID:136769 发表于 2020-1-15 16:10 | 只看该作者
很好,很棒
回复

使用道具 举报

21#
ID:635223 发表于 2020-2-12 15:48 | 只看该作者
很实用,现在正好在学习这个东西,非常感谢
回复

使用道具 举报

22#
ID:294296 发表于 2020-2-12 16:39 | 只看该作者
感谢楼主,,太厉害了,很好的资料,我用方波电机都转不稳
回复

使用道具 举报

23#
ID:334249 发表于 2020-6-13 14:54 | 只看该作者
感谢分享!
回复

使用道具 举报

24#
ID:384489 发表于 2021-8-30 14:47 | 只看该作者
学习BLDC中,不错的资料。
回复

使用道具 举报

25#
ID:6656 发表于 2021-8-30 15:02 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

26#
ID:430872 发表于 2022-3-29 10:08 | 只看该作者
最近正在学习中~~·找找前辈们的资料学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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