OpenEdv-开源电子网

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

步进电机驱动程序

[复制链接]

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
发表于 2017-5-13 19:45:00 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 八度空间 于 2017-5-13 20:46 编辑

#define RCR_VAL    255  //每计数(RCR_VAL+1)次,中断一次,这个值(0~255)设置大一些可以降低中断频率    可是tim8不是已经设置了溢出中断了吗? 到底是怎么回事  不应该是tim8溢出一次中断一次吗 难道和单脉冲模式有关? 求解大神

最佳答案

查看完整内容[请看2#楼]

重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事 件(UEV)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-13 19:49:05 | 显示全部楼层

步进电机驱动程

#define RCR_VAL    255  //每计数(RCR_VAL+1)次,中断一次,这个值(0~255)设置大一些可以降低中断频率    可是tim8不是已经设置了溢出中断了吗? 到底是怎么回事  不应该是tim8溢出一次中断一次吗 难道和单脉冲模式有关? 求解大神
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-13 19:50:53 | 显示全部楼层

步进电机驱动程序

#define RCR_VAL    255  //每计数(RCR_VAL+1)次,中断一次,这个值(0~255)设置大一些可以降低中断频率    可是tim8不是已经设置了溢出中断了吗? 到底是怎么回事  不应该是tim8溢出一次中断一次吗 难道和单脉冲模式有关? 求解大神
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-13 19:45:01 | 显示全部楼层
gyjddq 发表于 2017-5-16 18:14
void TIM8_OPM_RCR_Init(u16 arr,u16 psc)
{                                                          
        GPIO_InitTypeDef GPIO_InitStructure;

重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事
件(UEV)
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-13 19:59:17 | 显示全部楼层
完蛋标题打错改不回来了    编辑完保存还是   法    完蛋
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-5-13 20:46:59 | 显示全部楼层
gyjddq 发表于 2017-5-13 19:59
完蛋标题打错改不回来了    编辑完保存还是   法    完蛋

帮你改过来了,这样对么?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-14 10:28:49 | 显示全部楼层
八度空间 发表于 2017-5-13 20:46
帮你改过来了,这样对么?

嗯 对   你则么改过来的啊 我则么不行尼
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-5-14 10:51:30 | 显示全部楼层
gyjddq 发表于 2017-5-14 10:28
嗯 对   你则么改过来的啊 我则么不行尼

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-14 11:47:34 | 显示全部楼层

我的贴我都改不了好气哦
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-14 11:48:57 | 显示全部楼层
gyjddq 发表于 2017-5-14 11:47
我的贴我都改不了好气哦

话说你能帮我解决上面德问题吗我好晕
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-5-14 15:06:58 | 显示全部楼层
你是用中断溢出来计数输出的脉冲?
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-15 17:02:33 | 显示全部楼层
八度空间 发表于 2017-5-14 15:06
你是用中断溢出来计数输出的脉冲?

TIM_UpdateRequestConfig(TIM8,TIM_UpdateSource_Regular);/只有计数器溢作为更新中断
TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);//单脉冲模式
终端中有一句   TIM8->RCR=RCR_VAL;//设置重复计数值     RCR_VA=255
应该是一个脉冲进入一次中断还是255个进一次尼     晕蛋
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-5-15 23:17:56 | 显示全部楼层
gyjddq 发表于 2017-5-15 17:02
TIM_UpdateRequestConfig(TIM8,TIM_UpdateSource_Regular);/只有计数器溢作为更新中断
TIM_SelectOnePul ...

你是向上计数吧?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-16 08:06:16 | 显示全部楼层
发出256个脉冲后进入中断。
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-16 12:04:50 | 显示全部楼层

是向上计数
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-16 12:15:52 | 显示全部楼层
沧海 发表于 2017-5-16 08:06
发出256个脉冲后进入中断。

就是说设置为单脉冲模式后 在设置计数个数     计数器溢出才会进入中断  并不会每计数一个数就进入中断咯      
我还有一个问题  就是计数个数寄存器是在中断里附值的  是为了第一次进入中断不计数256次吗
如果是也就是说即使设为单脉冲模式但是计数个数寄存器没有赋值仍会没发送一个脉冲进入中断一次吗            我看的是f4的步进电机例程
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-16 12:19:09 | 显示全部楼层
本帖最后由 gyjddq 于 2017-5-16 12:20 编辑
gyjddq 发表于 2017-5-16 12:15
就是说设置为单脉冲模式后 在设置计数个数     计数器溢出才会进入中断  并不会每计数一个数就进入中断咯 ...

不好意思是重复计数寄存器  不是计数个数寄存器
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-16 17:08:03 | 显示全部楼层
gyjddq 发表于 2017-5-16 12:15
就是说设置为单脉冲模式后 在设置计数个数     计数器溢出才会进入中断  并不会每计数一个数就进入中断咯 ...

没看到程序不知道
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-16 18:14:54 | 显示全部楼层
沧海 发表于 2017-5-16 17:08
没看到程序不知道

void TIM8_OPM_RCR_Init(u16 arr,u16 psc)
{                                                          
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);          //TIM8ê±Öóê1Äü   
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);         //ê1ÄüPORTCê±Öó                                                                                    

        GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8); //GPIOC7¸′óÃÎa¶¨ê±Æ÷8
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;           //GPIOC7
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //¸′óÃ1|Äü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //Ëù¶è100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //íÆíì¸′óÃêä3ö
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;      //ÏÂà-
        GPIO_Init(GPIOC,&GPIO_InitStructure);               //3õê¼»ˉPF9
       
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
       
        TIM_TimeBaseStructure.TIM_Period = arr; //éèÖÃÔúÏÂò»¸ö¸üDÂê¼t×°èë»î¶ˉμÄ×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ         
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éèÖÃóÃà′×÷ÎaTIMxê±ÖóÆμÂê3yêyμÄÔ¤·ÖÆμÖμ   
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
        TIM_ClearITPendingBit(TIM8,TIM_IT_Update);

        TIM_UpdateRequestConfig(TIM8,TIM_UpdateSource_Regular); /********* éèÖÃÖ»óD¼Æêyòç3ö×÷Îa¸üDÂÖD¶Ï ********/
        TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);/******* μ¥Âö3åÄ£ê½ **********/

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3ö2ê1Äü
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; /****** ±è½Ïêä3ö2Nê§Äü *******/
        TIM_OCInitStructure.TIM_Pulse = arr>>1; //éèÖÃ′y×°èë2¶»ñ±è½Ï¼Ä′æÆ÷μÄÂö3åÖμ
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OC2Init(TIM8, &TIM_OCInitStructure);  //¸ù¾YTIM_OCInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIMx

        TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);  //CH2Ô¤×°ÔØê1Äü         
        TIM_ARRPreloadConfig(TIM8, ENABLE); //ê1ÄüTIMxÔúARRéÏμÄÔ¤×°ÔØ¼Ä′æÆ÷
       
        TIM_ITConfig(TIM8, TIM_IT_Update ,ENABLE);  //TIM8   ê1Äü»òÕßê§ÄüÖ¸¶¨μÄTIMÖD¶Ï

        NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;  //TIM8ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //ÏèÕ¼óÅÏè¼¶1¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //′óóÅÏè¼¶1¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
       
        TIM_ClearITPendingBit(TIM8, TIM_IT_Update);  //Çå3yTIMxμÄÖD¶Ï′y′|àíλ:TIM ÖD¶ÏÔ′
        TIM_Cmd(TIM8, ENABLE);  //ê1ÄüTIM8                                                                                          
}
/******* TIM8¸üDÂÖD¶Ï·tÎñ3ìDò *********/
void TIM8_UP_TIM13_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM8,TIM_FLAG_Update)!=RESET)//¸üDÂÖD¶Ï
        {
                TIM_ClearITPendingBit(TIM8,TIM_FLAG_Update);//Çå3y¸üDÂÖD¶Ï±ê־λ
                if(is_rcr_finish==0)//ÖØ¸′¼ÆêyÆ÷Î′éèÖÃíê3é
                {
                        if(rcr_integer!=0) //Õûêy2¿·ÖÂö3å»1Î′·¢Ëííê3é
                        {
                                TIM8->RCR=RCR_VAL;//éèÖÃÖØ¸′¼ÆêyÖμ
                                rcr_integer--;//¼õéùRCR_VAL+1¸öÂö3å                               
                        }else if(rcr_remainder!=0)//óàêy2¿·ÖÂö3å 2»Î»0
                        {
                                TIM8->RCR=rcr_remainder-1;//éèÖÃóàêy2¿·Ö
                                rcr_remainder=0;//Çåáã
                                is_rcr_finish=1;//ÖØ¸′¼ÆêyÆ÷éèÖÃíê3é                               
                        }else goto out;   //rcr_remainder=0£¬Ö±½óíË3ö                         
                        TIM_GenerateEvent(TIM8,TIM_EventSource_Update);//2úéúò»¸ö¸üDÂê¼t ÖØDÂ3õê¼»ˉ¼ÆêyÆ÷
                        TIM_CtrlPWMOutputs(TIM8,ENABLE);        //MOE Ö÷êä3öê1Äü       
                        TIM_Cmd(TIM8, ENABLE);  //ê1ÄüTIM8                       
                        if(motor_dir==CW) //èç1û·½ÏòÎaË3ê±Õë   
                                current_pos+=(TIM8->RCR+1);//¼óéÏÖØ¸′¼ÆêyÖμ
                        else          //·ñÔò·½ÏòÎaÄæê±Õë
                                current_pos-=(TIM8->RCR+1);//¼õè¥Öظ′¼ÆêyÖμ                       
                }else
                {
out:                is_rcr_finish=1;//ÖØ¸′¼ÆêyÆ÷éèÖÃíê3é
                        TIM_CtrlPWMOutputs(TIM8,DISABLE);        //MOE Ö÷êä3ö1رÕ
                        TIM_Cmd(TIM8, DISABLE);  //1رÕTIM8                               
                        printf("μ±Ç°Î»ÖÃ=%ld\r\n",current_pos);//′òó¡êä3ö
                }       
        }
}
注释我也不知道为什么就炸了
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-5-17 11:48:52 | 显示全部楼层
gyjddq 发表于 2017-5-14 10:28
嗯 对   你则么改过来的啊 我则么不行尼

他是版主,想怎么改就怎么改
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-3-6
在线时间
20 小时
 楼主| 发表于 2017-5-17 16:50:33 | 显示全部楼层
Sun_Fly 发表于 2017-5-17 11:48
他是版主,想怎么改就怎么改

我说呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 12:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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