首页 > 评测 > 亚星娱乐登录体育真人

亚星娱乐登录体育真人

  • 作者:
  • 来源:
  • [导读]
  • 本帖最后由 yuyy1989 于 2023-6-24 19:01 编辑 #申请原创# 6.用MCPWM让电机转起来 之前用手动控制IO的方法成功让电机转了起来,不过LKS32MC071有电机控制专用的MCPWM模块,是一个精确控制电机驱动波形输出的
本帖最后由 yuyy1989 于 2023-6-24 19:01 编辑

#申请原创# 6.用MCPWM让电机转起来
之前用手动控制IO的方法成功让电机转了起来,不过LKS32MC071有电机控制专用的MCPWM模块,是一个精确控制电机驱动波形输出的模块。
首先对上一贴的控制序列做个处理,UP UN VP VN WP WN序列
1 1 0 0 0 1
0 1 1 1 0 0
0 0 0 1 1 1
停止时
0 1 0 1 0 1
转换为波形是这样的

从手册里看MCPWM的介绍,貌似找不到合适的波形输出,改一下这个序列,因为电机引脚有个下拉电阻

我想是不是不用的引脚直接拉低也行,所以变成
1 1 0 0 0 0
0 0 1 1 0 0
0 0 0 0 1 1
再转成波形

这次就很容易找到对应的了

中心对齐输出,但是CHN要翻转一下
先用上一贴的手动控制IO的方法试了一下,这个序列是可以转起来的,接下来编写MCPWM的代码
为了保证能转起来,IO的切换速度尽量靠近手动控制IO的速度,手动控制IO时是每10ms转动三分之一,换成一个PWM周期是30ms,频率在30Hz左右,用12M的系统时钟可以正好得到这个频率,但是在实际使用时发现设置成12M时钟后MCU不工作了,尝试24M时钟可以正常工作,因此最终频率设置成了50Hz
工程需添加库文件lks32mc07x_mcpwm.c

代码示例
  1. #include "lks32mc07x.h"
  2. #include "yuyy_delay.h"

  3. void led_init(void)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStruct;
  6.     GPIO_StructInit(&GPIO_InitStruct);
  7.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  8.     GPIO_InitStruct.GPIO_Pin =  LED_PINS;
  9.     GPIO_Init(LED_GPIO, &GPIO_InitStruct);
  10.     GPIO_ResetBits(LED_GPIO, LED1_PIN|LED2_PIN);
  11.     GPIO_SetBits(LED_GPIO, LED3_PIN);
  12. }

  13. void key_init()
  14. {
  15.     GPIO_InitTypeDef GPIO_InitStruct;
  16.     GPIO_StructInit(&GPIO_InitStruct);
  17.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  18.     GPIO_InitStruct.GPIO_Pin =  KEY_PINS;
  19.     GPIO_Init(KEY_GPIO, &GPIO_InitStruct);
  20. }

  21. void uvw_testinit()
  22. {
  23.     GPIO_InitTypeDef GPIO_InitStruct;
  24.     GPIO_StructInit(&GPIO_InitStruct);
  25.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  26.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
  27.     GPIO_Init(GPIO1, &GPIO_InitStruct);
  28.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_4, AF3_MCPWM);
  29.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_5, AF3_MCPWM);
  30.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_6, AF3_MCPWM);
  31.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_7, AF3_MCPWM);
  32.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_8, AF3_MCPWM);
  33.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_9, AF3_MCPWM);
  34. }

  35. #define MCU_MCLK                       (24000000LL)
  36. #define PWM_MCLK                       ((u32)MCU_MCLK)
  37. #define PWM_MCLK_DIV                   3
  38. #if(PWM_MCLK_DIV == 0)
  39. #define PWM_PRSC
  40. #elif(PWM_MCLK_DIV == 1)
  41. #define PWM_PRSC                       2
  42. #elif(PWM_MCLK_DIV == 2)
  43. #define PWM_PRSC                       4
  44. #elif(PWM_MCLK_DIV == 3)
  45. #define PWM_PRSC                       8
  46. #endif
  47. #define PWM_FREQ0                      ((u16)50)


  48. #define MCPWM_PERIOD0                    ((u16) (PWM_MCLK / (u32)(2 * PWM_FREQ0 *(PWM_PRSC)))) //15位 最大32767
  49. #define MCPWM_WIDTH  (MCPWM_PERIOD0*2/3)

  50. #define DEADTIME_NS                    ((u16)1200)
  51. #define DEADTIME                       (u16)(((unsigned long long)PWM_MCLK * (unsigned long long)DEADTIME_NS)/1000000000uL)

  52. void mcpwm_init()
  53. {
  54.     MCPWM_InitTypeDef MCPWM_InitStructure;
  55.     MCPWM_StructInit(&MCPWM_InitStructure);

  56.     MCPWM_InitStructure.MCLK_EN = ENABLE;
  57.     MCPWM_InitStructure.CLK_DIV = PWM_MCLK_DIV;

  58.     MCPWM_InitStructure.IO_FLT_CLKDIV  = 12;
  59.     MCPWM_InitStructure.CMP_FLT_CLKDIV = 12;

  60.     MCPWM_InitStructure.AUEN = MCPWM0_ALL_AUPDAT;



  61.     MCPWM_InitStructure.BASE_CNT0_EN = ENABLE;
  62.     MCPWM_InitStructure.TH0 = MCPWM_PERIOD0;

  63.     MCPWM_InitStructure.TH00 = (u16)(-MCPWM_PERIOD0+5);
  64.     MCPWM_InitStructure.TH01 = (u16)(-MCPWM_PERIOD0+MCPWM_WIDTH-5);
  65.     MCPWM_InitStructure.TH10 = (u16)(-MCPWM_PERIOD0+MCPWM_WIDTH+5);
  66.     MCPWM_InitStructure.TH11 = (u16)(MCPWM_PERIOD0-MCPWM_WIDTH-5);
  67.     MCPWM_InitStructure.TH20 = (u16)(MCPWM_PERIOD0-MCPWM_WIDTH+5);
  68.     MCPWM_InitStructure.TH21 = (u16)(MCPWM_PERIOD0-5);

  69.     MCPWM_InitStructure.MCPWM_WorkModeCH0 = MCPWM0_CENTRAL_PWM_MODE;
  70.     MCPWM_InitStructure.MCPWM_WorkModeCH1 = MCPWM0_CENTRAL_PWM_MODE;
  71.     MCPWM_InitStructure.MCPWM_WorkModeCH2 = MCPWM0_CENTRAL_PWM_MODE;
  72.     MCPWM_InitStructure.DeadTimeCH012N = DEADTIME;
  73.     MCPWM_InitStructure.DeadTimeCH012P = DEADTIME;
  74.     MCPWM_InitStructure.CMP_CTRL_CNT0  = DISABLE ;
  75.     MCPWM_InitStructure.EVT_CNT0_EN    = DISABLE ;
  76.     MCPWM_InitStructure.EVT0           = DISABLE ;

  77.     MCPWM_InitStructure.TR0_UP_INTV     = DISABLE;
  78.     MCPWM_InitStructure.TR0_T0_UpdateEN = ENABLE ;
  79.     MCPWM_InitStructure.TR0_T1_UpdateEN = DISABLE ;
  80.     MCPWM_InitStructure.TR0_AEC         = DISABLE;

  81.     MCPWM_InitStructure.T0_Update0_INT_EN = DISABLE;
  82.     MCPWM_InitStructure.T1_Update0_INT_EN = DISABLE ;
  83.     MCPWM_InitStructure.Update1_INT_EN = DISABLE;

  84.     MCPWM_InitStructure.CH0N_Polarity_INV = ENABLE;
  85.     MCPWM_InitStructure.CH0P_Polarity_INV = DISABLE;
  86.     MCPWM_InitStructure.CH1N_Polarity_INV = ENABLE;
  87.     MCPWM_InitStructure.CH1P_Polarity_INV = DISABLE;
  88.     MCPWM_InitStructure.CH2N_Polarity_INV = ENABLE;
  89.     MCPWM_InitStructure.CH2P_Polarity_INV = DISABLE;

  90.     MCPWM_InitStructure.Switch_CH0N_CH0P =  DISABLE;
  91.     MCPWM_InitStructure.Switch_CH1N_CH1P =  DISABLE;
  92.     MCPWM_InitStructure.Switch_CH2N_CH2P =  DISABLE;


  93.     MCPWM_InitStructure.CH0P_default_output = MCPWM0_LOW_LEVEL;
  94.     MCPWM_InitStructure.CH0N_default_output = MCPWM0_HIGH_LEVEL;
  95.     MCPWM_InitStructure.CH1P_default_output = MCPWM0_LOW_LEVEL;
  96.     MCPWM_InitStructure.CH1N_default_output = MCPWM0_HIGH_LEVEL;
  97.     MCPWM_InitStructure.CH2P_default_output = MCPWM0_LOW_LEVEL;
  98.     MCPWM_InitStructure.CH2N_default_output = MCPWM0_HIGH_LEVEL;

  99.     MCPWM_InitStructure.CH0N_FAIL_EN = ENABLE ;
  100.     MCPWM_InitStructure.CH0P_FAIL_EN = ENABLE ;
  101.     MCPWM_InitStructure.CH1N_FAIL_EN = ENABLE ;
  102.     MCPWM_InitStructure.CH1P_FAIL_EN = ENABLE ;
  103.     MCPWM_InitStructure.CH2N_FAIL_EN = ENABLE ;
  104.     MCPWM_InitStructure.CH2P_FAIL_EN = ENABLE ;

  105.     MCPWM_InitStructure.FAIL0_INPUT_EN   = DISABLE ;//FAIL_0CAP
  106.     MCPWM_InitStructure.FAIL0_INT_EN     = DISABLE;
  107.     MCPWM_InitStructure.FAIL0_Signal_Sel = MCPWM0_FAIL_SEL_CMP ;//FAIL_0CAP
  108.     MCPWM_InitStructure.FAIL0_Polarity   = MCPWM0_HIGH_LEVEL_ACTIVE ;

  109.     MCPWM_InitStructure.FAIL1_INPUT_EN   = DISABLE ;//FAIL_0CAP
  110.     MCPWM_InitStructure.FAIL1_INT_EN     = DISABLE;
  111.     MCPWM_InitStructure.FAIL1_Signal_Sel = MCPWM0_FAIL_SEL_IO ;//FAIL_0CAP
  112.     MCPWM_InitStructure.FAIL1_Polarity   = MCPWM0_HIGH_LEVEL_ACTIVE ;

  113.     MCPWM_InitStructure.HALT_PRT0        = DISABLE ;
  114.     MCPWM_InitStructure.FAIL_0CAP        = DISABLE ;
  115.     MCPWM_Init(&MCPWM_InitStructure);

  116.     NVIC_SetPriority(MCPWM0_IRQn, 1);
  117.     NVIC_EnableIRQ(MCPWM0_IRQn);
  118. }

  119. void MCPWM0_IRQHandler(void)
  120. {

  121. }

  122. void mcu_init(void)
  123. {
  124.     __disable_irq();
  125.     SYS_WR_PROTECT = 0x7a83;
  126.     FLASH_CFG |= 0x00080000;
  127.     IWDG_DISABLE();
  128.     SYS_MclkChoice(SYS_MCLK_24M_RC);
  129.     led_init();
  130.     key_init();
  131.     uvw_testinit();
  132.     mcpwm_init();
  133.     yuyy_delay_us(100);
  134.     SYS_WR_PROTECT = 0x0;
  135.     __enable_irq();
  136. }

  137. int main(void)
  138. {
  139.     uint8_t run = 0;
  140.     uint8_t key_start_downcount = 0;
  141.     uint8_t key_stop_downcount = 0;
  142.     uint8_t runstep = 0;
  143.     mcu_init();
  144.     while (1)
  145.     {
  146.         if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY_START_PIN))
  147.         {
  148.             if(key_start_downcount <0xFF)
  149.                 key_start_downcount++;
  150.         }
  151.         else
  152.         {
  153.             if(key_start_downcount > 3 && run == 0)
  154.             {
  155.                 run = 1;
  156.                 runstep = 0;
  157.                 PWMOutputs(ENABLE);
  158.             }
  159.             key_start_downcount = 0;
  160.         }

  161.         if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY_STOP_PIN))
  162.         {
  163.             if(key_stop_downcount <0xFF)
  164.                 key_stop_downcount++;
  165.         }
  166.         else
  167.         {
  168.             if(key_stop_downcount > 3 && run > 0)
  169.             {
  170.                 run = 0;
  171.                 runstep = 0;
  172.                 PWMOutputs(DISABLE);
  173.             }
  174.             key_stop_downcount = 0;
  175.         }

  176.         if(runstep > 0)
  177.             runstep--;
  178.         else
  179.         {
  180.             runstep = 20;
  181.             switch(run)
  182.             {
  183.                 case 1:
  184.                     GPIO_SetBits(LED_GPIO, LED1_PIN);
  185.                     GPIO_ResetBits(LED_GPIO, LED2_PIN);
  186.                     GPIO_SetBits(LED_GPIO, LED3_PIN);
  187.                     run = 2;
  188.                     break;
  189.                 case 2:
  190.                     GPIO_ResetBits(LED_GPIO, LED1_PIN);
  191.                     GPIO_SetBits(LED_GPIO, LED2_PIN);
  192.                     GPIO_SetBits(LED_GPIO, LED3_PIN);
  193.                     run = 3;
  194.                     break;
  195.                 case 3:
  196.                     GPIO_ResetBits(LED_GPIO, LED1_PIN);
  197.                     GPIO_ResetBits(LED_GPIO, LED2_PIN);
  198.                     GPIO_ResetBits(LED_GPIO, LED3_PIN);
  199.                     run = 1;
  200.                     break;
  201.                 default:
  202.                     GPIO_ResetBits(LED_GPIO, LED1_PIN);
  203.                     GPIO_ResetBits(LED_GPIO, LED2_PIN);
  204.                     GPIO_SetBits(LED_GPIO, LED3_PIN);
  205.                     run = 0;
  206.                     break;
  207.             }
  208.         }
  209.         yuyy_delay_ms(10);
  210.     }
  211. }
复制代码
正式接电机使用前,如果有示波器最好用示波器看一下波形是否正常,以免烧坏电机
运行效果

这只是一个刚入门无刷电机的人做的一个简单的用MCPWM驱动电机的示例,后面会继续研究无刷电机的控制方法

  • 本文系21ic原创,未经许可禁止转载!

亚星娱乐登录彩票