shuishou 发表于 2016-11-10 09:57:02

签到
签到

x5y4z3 发表于 2016-11-10 09:58:44

※ 签到,签到!

zhangdaijin 发表于 2016-11-10 10:01:08

签到签到

zhangdaijin 发表于 2016-11-10 10:01:40

天天签到

笑鸟007 发表于 2016-11-10 10:03:28

签到QQQ:)

wofei1314 发表于 2016-11-10 10:16:39

签到赚金币喽~

JackieLaura 发表于 2016-11-10 10:20:01

签到签到

dzzwoaizi 发表于 2016-11-10 10:21:33

两种方案:第一种就时STM32每个IO口都用按键中断,你可以牺牲一个定时器,当一个中断过来就计数,等待下一个中断进来后两者的差就得出了一个与速度相关的值,说句实话编码器没用过,我用的是HALL接口。这种方法是比较简单的,
第二种方法就是楼主所说的,定时器里面有hall接口,同时可以捕获定时器的值,还是以HALL为例,配置好后会每60度(电角度)进入中断一次,同事进入后捕获开始,也就是定时器开始计数。计数出来的值就是电机转过60度的时间(电角度)。配置我会截图给你,其实还可以计数跑了多少个PWM周期。在PWM中断里计数。通常他们是这莫做的,应为在FOC中可以简化运算。不知道你的编码器是咋样回事了,但是都应该通用的。
配置如下:
//GPIO
GPIO_InitTypeDefGPIO_InitStructure;
//Interrupt
NVIC_InitTypeDef NVIC_InitStructure;
//Tmer
TIM_BDTRInitTypeDefTIM_BDTRInitStructure;           //死区刹车结构体变量定义
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;         //定义结构体变量
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

//---------------------------------TMER3 HALL------------------------------
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_0);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_0);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure);

TIM_TimeBaseStructure.TIM_Prescaler = 47;                                                                           //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(TIM3,&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(TIM3, &TIM_ICInitStructure);                     //输入通道配置

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(TIM3,&TIM_OCInitStructure);

TIM_SelectHallSensor(TIM3,ENABLE);                        //使能TIMx的霍尔传感器接口

TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //输入触发源选择   

TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //从模式选择

TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式选择      

//        TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref );//选择输出触发模式(TRGO端)
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;              //开TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);   //开定时器中断
TIM_ClearFlag(TIM3, TIM_FLAG_Trigger);
TIM_ClearFlag(TIM3, TIM_FLAG_CC4);

TIM_Cmd(TIM3,ENABLE);


//中断入口。
void TIM3_IRQHandler(void)
{
if((TIM_GetFlagStatus(TIM3,TIM_FLAG_Trigger)) != RESET )
{
    TIM_ClearITPendingBit(TIM3, TIM_FLAG_Trigger);
    HallPLLCtrl();       

}

}

beisongcrt 发表于 2016-11-10 10:28:02

签到签到

chen_hang 发表于 2016-11-10 10:29:19

签到签到
页: 1 2 3 4 5 [6] 7 8 9 10 11
查看完整版本: 【2016.11.10】今日问题:stm32 电机控制低速测速问题