打印
[MM32硬件]

灵动微单片机MM32的PWM配置

[复制链接]
1644|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MM32SPIN422C今天我们来聊聊这个芯片:本产品使用高性能的 ARM ® Cortex TM -M0 为内核的 32 位微控制器,内嵌三相半桥栅极驱

使用特权

评论回复
沙发
人的发个哈哈|  楼主 | 2022-7-27 23:38 | 只看该作者
动器与 MOSFET。最高工作频率可达 96MHz,内置高速存储器,丰富的增强型 I/O 端口
和外设连接到外部总线。本产品包含 2 个 12 位的 ADC、2 个比较器、2 个运算放大器、1
个 16 位通用定时器、1 个 32 位通用定时器、3 个 16 位基本定时器、2 个 16 位高级定时
器。还包含标准的通信接口:1 个 I2C 接口、1 个 SPI 接口和 2 个 UART 接口。
本产品产品系列工作电压为 2.0V ∼ 5.5V,工作温度范围包含-40 ◦ C ∼ +85 ◦ C 常规型和-40 ◦ C
∼ +105 ◦ C 扩展型。多种省电工作模式保证低功耗应用的要求。

使用特权

评论回复
板凳
人的发个哈哈|  楼主 | 2022-7-27 23:42 | 只看该作者
本产品提供 QFN32 共 1 种封装形式;根据不同的封装形式,器件中的外设配置不尽相同。
这些丰富的外设配置,使得本产品微控制器适合于多种应用场合:
• 电机驱动和应用控制
• 医疗和手持设备
• PC 游戏外设和 GPS 平台
• 工业应用:可编程控制器(PLC)、变频器、打印机和扫描仪
• 警报系统、视频对讲、和暖气通风空调系统等
内嵌三相半桥栅极驱动器与MOSFET,显而易见。MCU与电机驱动集成一体。
使用此芯片可以直接驱动无刷电机。
官方手册驱动电流:1.5A Continuous(2A Peak);所以设计的时候就需要考虑好电流的问题了

使用特权

评论回复
地板
人的发个哈哈|  楼主 | 2022-7-27 23:44 | 只看该作者
MM32SPIN422C PWM配置,驱动无刷电机
这个芯片的驱动控制有一个使能脚,驱动无刷电机的时候需要打开这个引脚:
PB12使能驱动口

使用特权

评论回复
5
人的发个哈哈|  楼主 | 2022-7-27 23:54 | 只看该作者
/*******************************************************************************
* [url=home.php?mod=space&uid=139335]@name[/url]   : initGPIO_Timer1
* [url=home.php?mod=space&uid=247401]@brief[/url]  : Init GPIO Timer1
* @param  : void
* @retval : void
*******************************************************************************/
void initPWM_EN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  //开启GPIOA、GPIOB时钟

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

使用特权

评论回复
6
人的发个哈哈|  楼主 | 2022-7-27 23:57 | 只看该作者
然后正常配置互补PWM
GPIO口配置和互补PWM配置

使用特权

评论回复
7
人的发个哈哈|  楼主 | 2022-7-28 22:57 | 只看该作者
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);  //开启GPIOA、GPIOB时钟


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

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource8,GPIO_AF_2);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_2);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_2);

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

        GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_2);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_2);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_2);
       

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

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

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

        TIM_OCStructInit(&TIM_OCInitStructure);
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 500; //设置待装入捕获比较寄存器的脉冲值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
       
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
       
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
       
        TIM_OC3Init(TIM1, &TIM_OCInitStructure);
       

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

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

        TIM_Cmd(TIM1, ENABLE);  //使能TIM1   
}

/*******************************************************************************
* @name   : initNVIC_TIM1
* @brief  : PWM中断配置
* @param  : void
* @retval : void
*******************************************************************************/
void initNVIC_TIM1(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    // Config TIM1_CC_IRQn NVIC config
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* @name   : OnTIM1
* @brief  : Enable TIM1 使能定时器
* @param  : void
* @retval : void
*******************************************************************************/
void OnTIM1(void)
{
    TIM_Cmd(TIM1, ENABLE);
}
/*******************************************************************************
* @name   : TIM1_CC_IRQHandler
* @brief  : TIM1 Compare/Capture IRQHandler 定时器中断处理函数
* @param  : void
* @retval : void
*******************************************************************************/
volatile uint32_t TIMER0_Count = 0;
void TIM1_CC_IRQHandler()  //43us
{
    if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)
    {
        // Clear the CC1 flag
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
                        TIMER0_Count ++;
    }
}
//PWM初始化配置
void PWM_INIT_ALL(void)
{
        initPWM_EN();
        //config TIM to PWM output
        TIM1_PWM_Init(1999,0);
        initNVIC_TIM1();
        OnTIM1();
}
//占空比配置
TIM1->CCR1 = w_time_ph_a;
TIM1->CCR2 = w_time_ph_b;
TIM1->CCR3 = w_time_ph_c;

使用特权

评论回复
8
tpgf| | 2022-8-2 19:28 | 只看该作者
给定的速度都是io口可以实现的速度是吧

使用特权

评论回复
9
qcliu| | 2022-8-2 19:35 | 只看该作者
这代码真是太整齐了 很有调理

使用特权

评论回复
10
caigang13| | 2022-8-2 19:39 | 只看该作者
学习了,谢谢分享。

使用特权

评论回复
11
drer| | 2022-8-2 19:55 | 只看该作者
直接做乘**降低效率吗

使用特权

评论回复
12
coshi| | 2022-8-2 20:03 | 只看该作者
互补输出需要不同的两路吧

使用特权

评论回复
13
kxsi| | 2022-8-2 20:09 | 只看该作者
速度过快会出现什么问题

使用特权

评论回复
14
wiba| | 2022-8-2 20:15 | 只看该作者
最快速度能达到多少啊

使用特权

评论回复
评论
人的发个哈哈 2022-10-22 22:51 回复TA
最高工作频率可达 96MHz 
15
match007| | 2022-8-3 20:14 | 只看该作者
这个是不是驱动电机不错?

使用特权

评论回复
16
skyred| | 2022-8-15 20:23 | 只看该作者
是不是能直接驱动电机,不用mos了?

使用特权

评论回复
17
Bowclad| | 2022-9-16 20:59 | 只看该作者
这个驱动电机不错

使用特权

评论回复
18
人的发个哈哈|  楼主 | 2022-10-22 22:52 | 只看该作者
match007 发表于 2022-8-3 20:14
这个是不是驱动电机不错?

是的呀,这个驱动电机很不错的呢、

使用特权

评论回复
19
人的发个哈哈|  楼主 | 2022-10-22 22:53 | 只看该作者
wiba 发表于 2022-8-2 20:15
最快速度能达到多少啊

最高工作频率可达 96MHz

使用特权

评论回复
20
人的发个哈哈|  楼主 | 2022-10-22 22:54 | 只看该作者
skyred 发表于 2022-8-15 20:23
是不是能直接驱动电机,不用mos了?

使用此芯片可以直接驱动无刷电机。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

136

帖子

0

粉丝