你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103高级定时器TIM1产生六路PWM控制无刷舵机BLDC

[复制链接]
星火002 提问时间:2017-8-1 15:44 /
悬赏8ST金币未解决
首次发帖、不周之处请指正!
先描述下问题,最近在做120度霍尔BLDC的控制,用STM32F103 TIM1产生六路PWM时出现问题。
想要实现的控制状态是可以控制六个通道中任何一个通道的PWM输出与关断,不用互补、不需要死区
选用引脚:

TIM1配置如下图

主函数:

软件仿真:

我想要6路PWM的,但是只产生四路   PB0与PB1只在刚开始有输出
而且,当我把CH1设置为Disable时,CH1N仍然是Enable

仿真结果如下,CH1与CH1N不输出、其他四路输出正常

由此产生了几个问题
1、CH1的设置 会对PB0(CH2N)  PB1(CH3N)产生影响? CH1 Enable,CH2N、CH3N不输出,CH1 Disable CH2N、CH3N输出
2、CH1由Enable变为Disable  对CH1N的输出产生了影响,CH1 的失能与使能时CH1与CH1N的总开关?我之后使能CH1、失能CH1N,除CH1N以外的其余五路输出
怀疑是库函数的原因、尝试用寄存器写  手册与配置  仿真结果如下图



想要的输出状态是上图红线标注的   CH通道关闭  CHN通道输出,百度过这种输出状态,有人说可以实现但是没讲方法


这样配置六路均有输出、但是PB0、PB1不正常  而且也不是我想要的输出状态,可能是配置问题,很少用寄存器,不清楚这么对不对,请指正

前边都是截图,补一下TIM1配置部分、main部分代码
[code]
int main(void)
{
    delay_init();

My_BLDC-try1.rar

下载

3.44 MB, 下载次数: 574, 下载积分: ST金币 -1

我的代码

收藏 1 评论19 发布时间:2017-8-1 15:44

举报

19个回答
星火002 回答时间:2017-8-1 15:52:31
  1. void PWM_OUT_Init()
  2. {
  3.     //PA8  9  10 对应CBA  相  PA7  PB0 PB1 对应C-B-A-相  复用推挽输出
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  6.     TIM_OCInitTypeDef       TIM_OCInitStructure;
  7. //    TIM_BDTRInitTypeDef     TIM_BDTRInitStructure;  
  8.    
  9.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA , ENABLE); ///RCC_APB2Periph_AFIO
  10.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);  //需要部分重映像
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  13.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.    
  16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  18.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  20.    
  21.         TIM_DeInit(TIM1);
  22.        
  23.     /* Time Base configuration */
  24.     TIM_TimeBaseStructure.TIM_Prescaler = 0;
  25.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  26.     TIM_TimeBaseStructure.TIM_Period = 4500;  /// PWM 16K  
  27.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  28.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  29.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  30.     /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  31.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  ///TIM_OCMode_PWM2  TIM_OCMode_Timing
  32.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  33.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  34.     TIM_OCInitStructure.TIM_Pulse = 2000;
  35.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  ///TIM_OCNPolarity_High
  36.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  37.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; ///TIM_OCNIdleState_Set
  38.     TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

  39.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  40.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  41.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);

  42.     /* TIM1 counter enable */
  43.     TIM_Cmd(TIM1, ENABLE);

  44.     /* Main Output Enable */
  45.     TIM_CtrlPWMOutputs(TIM1, ENABLE);

  46. }
复制代码


  1. int main(void)
  2. {
  3.     delay_init();                     //延时函数初始化          
  4.     NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  5.     GPIO_init();
  6.     USART_init();
  7. //        Hall_Init();
  8.         PWM_OUT_Init();
  9.     GPIO_SetBits(GPIOA,GPIO_Pin_1);  //TX_OE

  10.         TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
  11.         TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
  12.         TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);

  13.         /*  Channel2 configuration */
  14.         TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1 );
  15.         TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
  16.         TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);

  17.         /*  Channel3 configuration */
  18.         TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
  19.         TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
  20.         TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);       

  21.         //N 通道受主通道影响  主DISABLE 则N通道也关闭

  22. //        TIM1->BDTR &=0xfc00;  //解锁
  23. //        TIM1->BDTR |= 0x8800;
  24. //        TIM1->CR2 |=0x1f80;
  25. //        TIM1->CCER = 0x00;  
  26. //        TIM1->CCER |= 0x555;
  27. }
复制代码

代码部分没贴上去,补一下
埃斯提爱慕 回答时间:2017-8-1 20:45:57
提示: 作者被禁止或删除 内容自动屏蔽
wenlong0601 回答时间:2017-8-1 20:54:41
帮顶啊。
星火002 回答时间:2017-8-1 21:56:24

谢谢
zero99 回答时间:2017-9-29 15:59:10
图片也太小了吧,根本看不清
五哥1 回答时间:2017-10-1 08:30:01
楼主解决了吗,坐等结果呀
贺工 回答时间:2017-10-14 21:02:36

关于如何输出六路互补带死区PWM波形,请关注“单片机STM32”公众号,里面有一篇文章“STM32定时器TIM1输出六路带死区互补PWM波形(一)”描述。
星火002 回答时间:2017-10-26 16:10:52
zero99 发表于 2017-9-29 15:59
图片也太小了吧,根本看不清

感兴趣可以下载源文件看哈
星火002 回答时间:2017-10-26 16:21:10
五哥1 发表于 2017-10-1 08:30
楼主解决了吗,坐等结果呀

最后驱动无刷使用的H_ON L_PWM的方式,只用了三路输出PWM,其余三路直接拉高拉低IO口
折腾了几天我的结论是 CH1的Enable与Disable是CH1与CH1N的总开关,无论寄存器还是库函数
引脚映射会对PWM输出产生影响,所以建议在最初调的时候先用原输出脚仿真
还有。。。有感无刷使用PWM方波驱动时有多种方式,六路互补输出不是必要的,而且也有论文指出六路PWM驱动的无刷会有MOS换相频繁、力矩波动的问题
星火002 回答时间:2017-10-26 16:29:51
贺工 发表于 2017-10-14 21:03
http://mp.weixin.qq.com/s?__biz=MzU3NTI2OTQ5NQ==&mid=100000051&idx=1&sn=265f1fe9fa26e58b85774851e149 ...

感谢
星火002 回答时间:2017-10-26 16:30:30
贺工 发表于 2017-10-14 21:03
http://mp.weixin.qq.com/s?__biz=MzU3NTI2OTQ5NQ==&mid=100000051&idx=1&sn=265f1fe9fa26e58b85774851e149 ...

感谢
hubang-393854 回答时间:2017-12-3 22:20:26
看起来很全,谢谢楼主
sjh2100 回答时间:2017-12-21 20:48:48
贺工 发表于 2017-10-14 21:02
关于如何输出六路互补带死区PWM波形,请关注“单片机STM32”公众号,里面有一篇文章“STM32定时器TIM1输出 ...

感谢分享
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版