[MM32软件] MM32SPIN422C PWM配置,驱动无刷电机

[复制链接]
1167|8
 楼主| 菜鸟的第一步 发表于 2022-2-28 12:20 | 显示全部楼层 |阅读模式
这个芯片的驱动控制有一个使能脚,驱动无刷电机的时候需要打开这个引脚:
PB12使能驱动口
  1. /*******************************************************************************
  2. * [url=home.php?mod=space&uid=139335]@name[/url]   : initGPIO_Timer1
  3. * [url=home.php?mod=space&uid=247401]@brief[/url]  : Init GPIO Timer1
  4. * @param  : void
  5. * @retval : void
  6. *******************************************************************************/
  7. void initPWM_EN(void)
  8. {
  9.   GPIO_InitTypeDef GPIO_InitStructure;
  10.        
  11.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  //开启GPIOA、GPIOB时钟

  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  16.        
  17.         GPIOB->BSRR = GPIO_Pin_12;  //使能栅极驱动器
  18. }


 楼主| 菜鸟的第一步 发表于 2022-2-28 12:21 | 显示全部楼层
然后正常配置互补PWM
GPIO口配置和互补PWM配置
  1. //PWM输出初始化
  2. //arr:自动重装值
  3. //psc:时钟预分频数
  4. void TIM1_PWM_Init(u16 arr,u16 psc)
  5. {  
  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  8.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  9.     TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
  10.        
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  12.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);  //开启GPIOA、GPIOB时钟


  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; //TIM1_CH1,TIM1_CH2
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  17.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,GPIO_AF_2);
  18.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_2);
  19.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_2);

  20.        
  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //TIM1_CH1N,TIM1_CH2N
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  25.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_2);
  26.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_2);
  27.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_2);
  28.        

  29.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  30.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  31.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  32.         TIM_TimeBaseStructure.TIM_RepetitionCounter =0;
  33.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  34.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  35.     /* Set the default configuration */
  36.         TIM_BDTRInitStruct.TIM_OSSRState = TIM_OSSRState_Enable;//运行模式下关闭状态选择
  37.         TIM_BDTRInitStruct.TIM_OSSIState = TIM_OSSIState_Enable;//空闲模式下关闭状态选择
  38.         TIM_BDTRInitStruct.TIM_LOCKLevel = TIM_LOCKLevel_OFF;//软件错误锁定配置:锁定关闭无保护
  39.         TIM_BDTRInitStruct.TIM_DeadTime = 0x5;//DTG[7:0]死区发生器配置:(死区时间DT)  ,注意死区时间要设成100ns左右,否则过大会导致MOS栅极PWM波形异常,太小导致上下臂短路
  40.         //TDTS = 125nS(8MHz)
  41.         //DTG[7: 5] = 0xx => DT = DTG[7: 0] * Tdtg, Tdtg = TDTS;
  42.         //DTG[7: 5] = 10x => DT =(64+DTG[5: 0]) * Tdtg, Tdtg = 2 * TDTS;
  43.         //DTG[7: 5] = 110 => DT =(32+DTG[4: 0]) * Tdtg, Tdtg = 8 * TDTS;
  44.         //DTG[7: 5] = 111=> DT =(32 + DTG[4: 0]) *  Tdtg, Tdtg = 16 * TDTS;

  45.         TIM_BDTRInitStruct.TIM_Break = TIM_Break_Disable;  //刹车配置:使能刹车
  46.         TIM_BDTRInitStruct.TIM_BreakPolarity = TIM_BreakPolarity_High;//刹车输入极性选择:高电平有效
  47.         TIM_BDTRInitStruct.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自动输出使能配置:MOE只能软件置1
  48.         TIM_BDTRConfig( TIM1, &TIM_BDTRInitStruct); //配置互补输出死区时间          

  49.         TIM_OCStructInit(&TIM_OCInitStructure);
  50.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  51.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  52.         TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
  53.         TIM_OCInitStructure.TIM_Pulse = 500; //设置待装入捕获比较寄存器的脉冲值
  54.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  55.         TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
  56.         TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;
  57.         TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
  58.        
  59.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  60.        
  61.        
  62.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
  63.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  64.         TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
  65.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  66.        
  67.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  68.        

  69.         TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能
  70.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH2预装载使能
  71.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH2预装载使能

  72.         TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_CCMR1_IC1F_1
  73.        
  74.         TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
  75.         TIM_CtrlPWMOutputs(TIM1,ENABLE);

  76.         TIM_Cmd(TIM1, ENABLE);  //使能TIM1   
  77. }

  78. /*******************************************************************************
  79. * @name   : initNVIC_TIM1
  80. * @brief  : PWM中断配置
  81. * @param  : void
  82. * @retval : void
  83. *******************************************************************************/
  84. void initNVIC_TIM1(void)
  85. {
  86.     NVIC_InitTypeDef NVIC_InitStructure;
  87.     // Config TIM1_CC_IRQn NVIC config
  88.     NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
  89.     NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  90.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  91.     NVIC_Init(&NVIC_InitStructure);
  92. }
  93. /*******************************************************************************
  94. * @name   : OnTIM1
  95. * @brief  : Enable TIM1 使能定时器
  96. * @param  : void
  97. * @retval : void
  98. *******************************************************************************/
  99. void OnTIM1(void)
  100. {
  101.     TIM_Cmd(TIM1, ENABLE);
  102. }
  103. /*******************************************************************************
  104. * @name   : TIM1_CC_IRQHandler
  105. * @brief  : TIM1 Compare/Capture IRQHandler 定时器中断处理函数
  106. * @param  : void
  107. * @retval : void
  108. *******************************************************************************/
  109. volatile uint32_t TIMER0_Count = 0;
  110. void TIM1_CC_IRQHandler()  //43us
  111. {
  112.     if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
  113.     {
  114.         // Clear the CC1 flag
  115.         TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
  116.                         TIMER0_Count ++;
  117.     }
  118. }
  119. //PWM初始化配置
  120. void PWM_INIT_ALL(void)
  121. {
  122.         initPWM_EN();
  123.         //config TIM to PWM output
  124.         TIM1_PWM_Init(1999,0);
  125.         initNVIC_TIM1();
  126.         OnTIM1();
  127. }
  128. //占空比配置
  129. TIM1->CCR1 = w_time_ph_a;
  130. TIM1->CCR2 = w_time_ph_b;
  131. TIM1->CCR3 = w_time_ph_c;


tpgf 发表于 2022-3-8 09:17 | 显示全部楼层
这个是芯片的规定吗
drer 发表于 2022-3-8 09:30 | 显示全部楼层
手册上有相关说明吗
qcliu 发表于 2022-3-8 09:39 | 显示全部楼层
一般是不是都用来驱动无刷电机啊
zljiu 发表于 2022-3-8 09:47 | 显示全部楼层
必须要进行使能一下吗
nawu 发表于 2022-3-8 09:58 | 显示全部楼层
是否可以上传一下整个工程呢
tfqi 发表于 2022-3-8 10:07 | 显示全部楼层
如何提高精度呢
sxy4517 发表于 2022-3-8 10:10 | 显示全部楼层
能简单说一下程序流程吗?
(1)PWM频率是多少?
(2)电机带霍尔吗?
(3)电流检测是怎么实现的?
(4)霍尔的信号是扫描还是中断,如果是扫描的话,频率是多少?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

459

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部