搜索
bottom↓
回复: 62

请教:使用stm32的高级定时器tim1做有感无刷电机驱动,现在已经能调速但是有一些技术问

[复制链接]

出0入0汤圆

发表于 2009-11-22 22:58:06 | 显示全部楼层 |阅读模式
现在正在使用stm32做一个带霍尔的无刷电机的驱动实验,电机使用的是光驱上拆下的有感无刷主轴电机。使用高级定时器tim1的pwm,现在电机能够旋转,而且通过调节PWM,电机的转速也可以调节(大约几百转/分到几千转/分)。
我的硬件驱动方式是使用tim1的3对PWM接3片ir2103后,驱动3相nmos管桥。

我想请问以下4个问题:
1.使用3对PWM接3片2103做半桥驱动与接3片2101做半桥驱动有什么不同??
        由于我很久之前买了一块别人做好了的dspic的无刷驱动板(使用2103做桥驱动),买了后一直也没时间搞,最近刚刚有时间想搞搞无刷,所以就找了出来。照着重新焊接了一块实验板,我以前一直以为ir2103和ir2101是一样的,所以也是使用2103做桥驱动,由于一直没有搞dspic,所以没有使用dspic的芯片,而是使用的stm32。
        硬件搞好后,写软件时才发现2103和2101是不同的。如果给2103接互补的输入信号,其输出是全低的(2101接互补输入就互补输出的);如果给2103接两路全0或全1,其输出是互补(2101的输出状态与输入相同)。这给我软件的设计带来了一些麻烦,不过也是能解决的。
        个人感觉2101做无刷电机控制的桥驱动要方便一些,请各位用过2103和2101的说说看法。

2.stm32的高级定时器tim1的pwm做有感无刷电机驱动,有没有像dspic或 Luminary“可以对每个PWM信号进行输出使能”的功能??
        我看过dspic的方案(an957,《使用dsPIC30F2010 控制带传感器的BLDC 电机》)和Luminary的方案(an01238,《Driving a Brushless DC Motor with aStellaris Microcontroller》)。这两种cpu都有“可以对每个PWM信号进行输出使能”的功能。例如:dspic的ovdcon寄存器(改写控制是MCPWM模块的最后级。它允许用户直接写入OVDCON 寄存器并控制输出引脚。详细信息见microchip的应用手册an957的第四页);Luminary的PWMOutputState函数,可以直接设定每路PWM输出的使能。
        如果stm32也有这个功能的话,我想对于上面的问题1,使用2101和2103就无所谓了我只要把不用pwm输出关掉即可。其实我现在也是这么做的,只不过感觉方法过于复杂,想知道到有没有简单的设置方法,比如像dspic和Luminary的那样简单的设置即可。

3.对于stm32的pwm输出禁止后的端口默认逻辑状态有没有可以设置的地方??
        如果在pwm输出设置禁止输出后,其端口的高低电平是随机的,则有可能对系统带来危险。请问有没有可靠的办法设置PWM禁止输出时的逻辑状态?

4.对于无刷电机使用的单极pwm和双极pwm有什么不同??
        我现在对某相绕组的通电方式是使用双极驱动,即如http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3599223&bbs_page_no=5&bbs_id=3020这个贴的三楼所描述的那样:
--------------------------------------
拿控制电机正转(假设是正转)来说:
受限单极式控制就是 左上 = PWM, 左下 = 0, 右上 = 0, 右下 = 1;
单极式控制就是,   左上 = PWM, 左下 = !左上, 右上 = 0, 右下 = 1;(这是最常用的)
双极式控制就是,   左上 = 右下, 左下 = 右上, 左下 = !左上;(这种控制方式比较少见,但是有利于克服静态摩擦死区,方便正反向切换,但是比较耗电,具体的可以看看相关资料,占空比表示为:P = 2Ton/T - 1(注意,这里的占空比不再是Ton/T了),P的范围是-1到1,P = 0时电机不转,但是电机电枢两端的瞬时电压和动态电流都不为0)
-------------------------------------------
其实我在做这个直流无刷实验之前先做的直流伺服的实验,当初做直流伺服时就是使用双极驱动做的,所以这个无刷我也是使用的双极驱动。
        但是我看到很多公司的驱动方案都是单极驱动的,请问对于无刷电机这两种驱动有什么不同?



第一次做无刷驱动,虽说能转了,但是很多问题还是没有搞清楚,请做过的人说说,谢谢!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-11-23 00:06:29 | 显示全部楼层
现在忙别的,回头就弄这个~~先记号

出0入0汤圆

发表于 2009-11-23 08:26:19 | 显示全部楼层
IR2103其实适合变频器应用,3相输出是互补的信号,比如SPWM输出或者SVPWM输出,如果单片机的PWM输出只有3个引脚,那么每个引脚直接连IR2103的HIN和LIN就可以输出互补信号了。

出0入0汤圆

 楼主| 发表于 2009-11-23 08:35:51 | 显示全部楼层
谢谢楼上的回复!

对于只有3个pwm的单片机使用2103方便,对于有3路互补输出的单片机使用2101更方便
可以这样理解吗?

我发现2103是无论如何也不会上下桥臂直通的,2101如果不加死区还是有可能的直通的

出0入0汤圆

发表于 2009-11-23 09:34:04 | 显示全部楼层
2和3都是可以的。通过设置CCMRx和CCER,具体还是要看下UM,里面有张表格是讲这个的。

并且可以强制设置高低电平。

我也在玩这个,目前仅是能转而已,期待高人指点,哈哈。

出0入0汤圆

发表于 2009-11-23 10:04:29 | 显示全部楼层
就是这个表:

(原文件名:tim1.png)

出0入0汤圆

发表于 2009-11-23 10:10:53 | 显示全部楼层
做个记号,以后试验

出0入0汤圆

 楼主| 发表于 2009-11-23 15:09:28 | 显示全部楼层
现在的cm3都是推荐使用库函数,其实对于这种对运行时间有要求的地方还是像AVR/51那样直接操作寄存器快。
stm32有没有统一的寄存器头文件??

出0入102汤圆

发表于 2009-11-23 15:11:41 | 显示全部楼层
记号,我试过直接按照DATASHEET里寄存器名称来做写入操作,结果编译失败。

出0入0汤圆

 楼主| 发表于 2009-11-23 15:16:52 | 显示全部楼层
楼上:编译失败那是肯定的,你可以看看库函数的源代码,只有在.h里定义的寄存器才能访问的。

好像很多寄存器都不是在.h里定义的。

出0入0汤圆

发表于 2009-11-23 16:35:27 | 显示全部楼层
ji

出0入0汤圆

发表于 2009-11-23 17:34:39 | 显示全部楼层
先记号 heihei

出0入0汤圆

 楼主| 发表于 2009-11-23 18:23:16 | 显示全部楼层
其实我一直在找stm32驱动bldc的例子,好像官方还没有,所以只能参考microchip或其他公司的应用手册。

不得不说microchip在电机控制方面的应用手册真的很不错。

出0入0汤圆

发表于 2009-11-23 21:59:11 | 显示全部楼层
关注中... ...

出0入0汤圆

 楼主| 发表于 2009-11-25 10:07:35 | 显示全部楼层
up

出0入0汤圆

发表于 2009-11-25 10:14:12 | 显示全部楼层
现在的cm3都是推荐使用库函数,其实对于这种对运行时间有要求的地方还是像AVR/51那样直接操作寄存器快。
stm32有没有统一的寄存器头文件??




实际用下来,使用库和不使用库差不多。库已经做的比较好了。

统一的寄存器头文件可以参考stm32f10x.h

出0入0汤圆

发表于 2009-11-25 10:17:25 | 显示全部楼层
其实我一直在找stm32驱动bldc的例子,好像官方还没有,所以只能参考microchip或其他公司的应用手册。

不得不说microchip在电机控制方面的应用手册真的很不错。



可以参考STM8驱动bldc的库和文档,:-)

出0入0汤圆

发表于 2009-11-26 21:14:53 | 显示全部楼层
实际用下来,使用库和不使用库差不多。库已经做的比较好了。

统一的寄存器头文件可以参考stm32f10x.h  
____________________________________________________  
请教楼上:

请问楼上做过测试吗?不知楼上做无刷的时候是针对库函数操作还是对寄存器操作?我们在做实验的时候,当电机运转的时候会出现偶尔一顿的现象,虽说不是很明显,但是仔细听的时候还是能感觉到的,个人分析应该是使用库函数的原因,但是再改动成寄存器操作的时候却出现了震动现象,可能是我搞错了,郁闷!

出0入0汤圆

发表于 2009-11-26 21:17:02 | 显示全部楼层
可以参考STM8驱动bldc的库和文档,:-)  
________________________________________________________________________________________________________

谢谢楼上,正在学习!

出0入0汤圆

发表于 2009-12-1 18:44:17 | 显示全部楼层
up

出0入0汤圆

发表于 2009-12-1 19:50:50 | 显示全部楼层
mark学习~

出0入0汤圆

发表于 2009-12-1 21:27:46 | 显示全部楼层
给你整个现成的芯片,有无霍尔都可以搞定.

(原文件名:1.gif)


(原文件名:2.gif)

出0入0汤圆

发表于 2010-3-10 13:01:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-13 23:26:32 | 显示全部楼层
......

出0入0汤圆

发表于 2010-3-13 23:36:15 | 显示全部楼层
高深的电机控制

出0入0汤圆

发表于 2010-4-26 19:46:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-26 20:28:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-27 16:13:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-27 19:39:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-30 23:59:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-1 09:50:13 | 显示全部楼层
对于单独控制PWM引脚逻辑电平的功能确实dsPIC比STM32好很多,但是STM32也还是能够曲线救国的,那就是切换的时候一个通道给PWM,另外一个通道给强制电平模式,而输出0的通道全部禁止比较功能。

出0入0汤圆

发表于 2010-9-19 11:10:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-19 13:37:03 | 显示全部楼层
博大精深

出0入0汤圆

发表于 2010-9-19 15:15:27 | 显示全部楼层
单独控制引脚电平可采用ccrx设置成0或设置成大于arr的任意值来实现

出0入0汤圆

发表于 2010-10-24 21:51:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-27 22:06:23 | 显示全部楼层
楼主,请教一下,你用的光驱无刷电机的三相绕组和霍尔信号的引脚是如何测出来的?

出0入0汤圆

发表于 2011-1-12 19:46:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-13 20:09:50 | 显示全部楼层
貌似很好玩,留名研究一下~~~

出0入0汤圆

发表于 2011-4-17 22:06:33 | 显示全部楼层
记下~~~~~

出0入0汤圆

发表于 2011-5-4 19:26:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-1 17:54:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-2 08:44:36 | 显示全部楼层
电机驱动用什么板哦?

出0入0汤圆

发表于 2011-7-17 22:02:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-17 23:40:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-18 08:27:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-23 22:20:10 | 显示全部楼层
最近也要转行去做电机控制了,关注你的贴,以后有问题请教。

出0入0汤圆

发表于 2011-9-9 10:43:37 | 显示全部楼层
按个爪印

出0入0汤圆

发表于 2011-9-9 15:29:44 | 显示全部楼层
楼主,我今天在用定时器1输出PWM,
但始终出来不了波型,不知为什么,

void  TIM_Configuration(void)
{   
   /*ÒÔÏÂΪ60msÖжÏÒ»´Î*/       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
        TIM_DeInit(TIM1);                                                                                                                  
        TIM_TimeBaseStructure.TIM_Period=60000-1;                                 /*×Ô¶¯ÖØ×°ÔؼĴæÆ÷µÄÖµ*/         
        TIM_TimeBaseStructure.TIM_Prescaler= (36 - 1);                            /*ʱÖÓÔ¤·ÖƵÊý*/
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                     /*²ÉÑù·ÖƵ*/
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;                                  /*¼ÆÊý·½ÏòÏòÉϼÆÊý */
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                           /*¸ù¾ÝTIM_TimeBaseStructureÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIM2µÄʱ¼ä»ùÊýµ¥Î»*/

    TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);                                      //Çå³ýTIM2µÈ´ýÖжϸüÐÂÖжϱê־λ

        TIM_ClearFlag(TIM1, TIM_FLAG_Update);                                     /*Çå³ýÒç³öÖжϱêÖ¾*/
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);                                                                  /*ʼÄܶ¨Ê±Æ÷µÄÖжÏ*/
        TIM_Cmd(TIM1, ENABLE);                                                    /*ʹÄܶ¨Ê±Æ÷*/

//////////////////////////////////////////////////////////////////////////////////////////////////
//  ÆôÓÃARRµÄÓ°×ӼĴæÆ÷£¨Ö±µ½²úÉú¸üÐÂʼþ²Å¸ü¸ÄÉèÖã©
    TIM_ARRPreloadConfig(TIM1, ENABLE);                        //ʹÄÜ»òÕßʧÄÜTIMxÔÚARRÉϵÄԤװÔؼĴæÆ÷                 

    //TIM1_OC1Ä£¿éÉèÖã¨ÉèÖÃ1ͨµÀÕ¼¿Õ±È£©
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         //TIM_OCModeÑ¡Ôñ¶¨Ê±Æ÷ģʽ   TIMÂö³å¿í¶Èµ÷ÖÆģʽ1 TIM_OCMode_PWM1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //ʹÄÜÕýÏòͨµÀ
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;        //ʹÄÜ·´ÏòͨµÀ
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //TIM_OCPolarityÊä³ö¼«ÐÔ
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;          //TIM_OCPolarity»¥²¹Êä³ö¼«ÐÔΪ¸ßµçƽ
    TIM_OCInitStructure.TIM_Pulse = 120;           //TIM_PulseÉèÖÃÁË´ý×°È벶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ¡£ËüµÄÈ¡Öµ±ØÐëÔÚ0x0000ºÍ0xFFFFÖ®¼ä¡£
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);   //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
    //ÆôÓÃCCR1¼Ä´æÆ÷µÄÓ°×ӼĴæÆ÷£¨Ö±µ½²úÉú¸üÐÂʼþ²Å¸ü¸ÄÉèÖã©
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);         //ʹÄÜ»òÕßʧÄÜTIMxÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷          TIMxÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷ʹÄÜ

    //TIM1_OC2Ä£¿éÉèÖã¨ÉèÖÃ2ͨµÀÕ¼¿Õ±È£©
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 680;
    TIM_OC2Init(TIM1, &TIM_OCInitStructure);        //ʹÄÜ»òÕßʧÄÜTIMxÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
    //ÆôÓÃCCR2¼Ä´æÆ÷µÄÓ°×ӼĴæÆ÷£¨Ö±µ½²úÉú¸üÐÂʼþ²Å¸ü¸ÄÉèÖã©
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);         //ʹÄÜ»òÕßʧÄÜTIMxÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
   
    //ËÀÇøÉèÖÃ
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
    TIM_BDTRInitStructure.TIM_DeadTime = 0x90;       //ÕâÀïµ÷ÕûËÀÇø´óС0-0xff
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
   
    //TIM1¿ªÆô
    TIM_Cmd(TIM1, ENABLE);
    //TIM1_OCͨµÀÊä³öPWM£¨Ò»¶¨Òª¼Ó£©
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
/////////////////////////////////////////////////////////////////////////////////////////////////////

}

出0入0汤圆

发表于 2011-9-9 20:16:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-10 15:30:34 | 显示全部楼层
楼主 怎么不把代码发上来啊

出0入0汤圆

发表于 2011-10-18 20:26:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-20 01:11:46 | 显示全部楼层
小弟学了avr,感觉芯片不划算,想转学stm32,不知stm32开发难度大不大

出0入0汤圆

发表于 2011-11-23 11:47:31 | 显示全部楼层
伺服电机的控制算发,能推荐一下吗?求!!!!

出0入0汤圆

发表于 2011-11-23 23:42:21 | 显示全部楼层
大家共同学习探讨!

出0入0汤圆

发表于 2011-12-2 08:31:25 | 显示全部楼层
伺服电机的控制算发,能推荐一下吗?求!!!!

出0入0汤圆

发表于 2011-12-2 20:11:29 | 显示全部楼层
飘过

出0入0汤圆

发表于 2011-12-6 07:32:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-5-28 16:41:29 | 显示全部楼层
定时器的互补输出原来是用来做电机驱动的啊

出0入0汤圆

发表于 2012-5-30 18:56:44 | 显示全部楼层
先记下   回头查看

出0入0汤圆

发表于 2012-10-2 23:08:10 | 显示全部楼层
好资料,mark

出0入0汤圆

发表于 2012-11-23 22:20:55 | 显示全部楼层
记下。。。。。

出0入0汤圆

发表于 2013-12-18 20:07:41 | 显示全部楼层
楼主  可以把程序贴出来看看吗?我现在也在玩这个,可是死区的时间太长了,楼主可以把你的程序发给我看看吗,我的邮箱是839129221@qq.com

出0入0汤圆

发表于 2014-4-12 20:50:58 | 显示全部楼层
记下。。。。。来了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 13:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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