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

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, 下载次数: 578, 下载积分: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版