OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13866|回复: 10

stm32控制直流无刷电机(带霍尔传感器)的程序,不能进入定时器1触发中断,求指教

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-6-11
在线时间
1 小时
发表于 2015-7-7 15:51:55 | 显示全部楼层 |阅读模式
5金钱

问下用stm32控制直流无刷电机的程序,这里用定时器2的3个通道捕获霍尔传感器的信号,用定时器1发生6路PWM,然后让定时器2触发定时器1,定时器2为主模式,定时器1为从模式,在定时器1触发中断里发生换相,但是在板子上电机从来没有转过,下面是配置,希望各位高手指点
 void BLDC_GPIOConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
  
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;  //TIM1输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//TIM1输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

 
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;              //TIM3的霍尔输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void BLDC_TIM1Config(void)
{
  
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;      //基本结构体变量定义
   TIM_OCInitTypeDef  TIM_OCInitStructure;                     //输出结构体变量定义
   TIM_BDTRInitTypeDef  TIM_BDTRInitStructure;       //死区刹车结构体变量定义

   TIM_DeInit(TIM1);

   TIM_TimeBaseStructure.TIM_Prescaler = 2;        //TIM基本初始化
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2;//中央对齐计数模式
   TIM_TimeBaseStructure.TIM_Period = 1499;        //PWM 16K
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;      //TIM输出通道初始化
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                 
   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;        
   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;         
 
   TIM_OC1Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC2Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC3Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;      //TIM输出通道4初始化,用来触发AD注入采样
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                  
   TIM_OCInitStructure.TIM_Pulse =1495;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;          
 
   TIM_OC4Init(TIM1,&TIM_OCInitStructure);
 
   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 = 100;
   TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;  //如打开,开机无输出且状态紊乱????
   TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
   TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

   TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);

   TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能捕获比较寄存器预装载(通道1)

   TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能捕获比较寄存器预装载(通道2)

   TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能捕获比较寄存器预装载(通道3)
  
   TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1);        //输入触发源选择TIM3  
 
   TIM_CtrlPWMOutputs(TIM1,ENABLE);

   TIM_Cmd(TIM1,ENABLE);
}
void BLDC_TIM2Config(void)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;      //基本结构体变量定义
   TIM_ICInitTypeDef TIM_ICInitStructure;                      //定义结构体变量
   TIM_OCInitTypeDef  TIM_OCInitStructure;                     //输出结构体变量定义
     
   TIM_DeInit(TIM2);

   TIM_TimeBaseStructure.TIM_Prescaler = 71;       //TIM基本初始化
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_Period =65535;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);    
     
   TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //选择通道1
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获 
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;  //配置通道为输入,并映射到哪里
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //输入捕获预分频值
   TIM_ICInitStructure.TIM_ICFilter = 10;                      //输入滤波器带宽设置

   TIM_ICInit(TIM2, &TIM_ICInitStructure);                     //输入通道配置

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;       //TIM输出通道初始化
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;            
   TIM_OCInitStructure.TIM_Pulse =1023;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     
 
   TIM_OC2Init(TIM2,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;       //TIM输出通道初始化
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;            
   TIM_OCInitStructure.TIM_Pulse =65535;
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     
 
   TIM_OC4Init(TIM2,&TIM_OCInitStructure);

   TIM_SelectHallSensor(TIM2,ENABLE);                          //使能TIMx的霍尔传感器接口
  
   TIM_SelectInputTrigger(TIM2, TIM_TS_TI1F_ED);               //输入触发源选择  
 
   TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);             //从模式选择

   TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//主从模式选择       
  
   TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC2Ref);      //选择输出触发模式(TRGO端)

   TIM_ITConfig(TIM2, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);      //开定时器中断
   }
  
void BLDC_Start(void)
{
   TIM1->SMCR|=0x0006;        //开TIM1的输入触发 
   TIM1->DIER=0x0040;         //开TIM1的触发中断
   huanxiang();         //调用换向函数,启动          
   TIM2->CR1|=0x0001;    //开TIM2
   TIM2->DIER|=0x0050;    //开TIM2中断 
}
void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;       //复位NVIC寄存器为默认值 
 

         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //设置中断优先级组
  
       /*配置EXTI中断及处理优先级*/
       NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_IRQn;//开TIM1触发中断
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //开TIM2中断
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);
}
                                   
            

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5780
金钱
5780
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-7-7 22:14:46 | 显示全部楼层
回复

使用道具 举报

29

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
966
金钱
966
注册时间
2014-10-9
在线时间
95 小时
发表于 2015-7-8 09:44:34 | 显示全部楼层
好高深,帮顶,我也想学这个,可是没机会
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2013-9-13
在线时间
3 小时
发表于 2015-10-8 17:32:54 | 显示全部楼层
为什么要用定时器检查霍尔呢
用外部中断检查不会更好吗
回复

使用道具 举报

11

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2016-3-27
在线时间
83 小时
发表于 2016-6-14 18:11:36 | 显示全部楼层
楼主可以讲下,这个程序的思路吗,不知道该怎么写,现在要做一个基于STM32的无位置传感器的无刷直流电机的控制,用反电动势测量位置,不知道整个程序该怎么写,大概的框架是怎么样的,求解
回复

使用道具 举报

91

主题

186

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-3-22
在线时间
122 小时
发表于 2016-6-14 18:16:23 | 显示全部楼层
我用输入捕获采集霍尔元件信号,1Khz的频率都很准确
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-8-7
在线时间
2 小时
发表于 2019-8-8 09:54:01 | 显示全部楼层
用外部中断触发可以转动
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-1-21
在线时间
45 小时
发表于 2020-6-8 09:43:19 | 显示全部楼层
你好,请问你提出的这个问题解决了吗?
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-1-21
在线时间
45 小时
发表于 2020-6-12 18:26:09 | 显示全部楼层
麻烦问你一下不能进入中断的问题解决了吗
回复

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-1-21
在线时间
45 小时
发表于 2020-6-16 09:59:58 | 显示全部楼层
定时器中断抢占优先级降低一些。
回复

使用道具 举报

4

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2019-5-9
在线时间
121 小时
发表于 2021-1-19 10:04:53 | 显示全部楼层
xp1179926265 发表于 2016-6-14 18:16
我用输入捕获采集霍尔元件信号,1Khz的频率都很准确

有例程可以参考一下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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