OpenEdv-开源电子网

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

42步进电机转速, tim1重复计数器RCR

[复制链接]

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2020-5-23 13:42:30 | 显示全部楼层 |阅读模式
今天分享一下42步进电机调试下来的数据:

平台是 高级定时器 Tim1输出指定的脉冲。利用重复计数器RCR实现

按200脉冲一圈测试下来,最快一个脉冲时间1200微秒////1200us
按额定转矩测下来,最快一个脉冲1700微秒////1700us

大概就是最快250转每分。(静止到旋转)  另外:旋转下再转到最快速度没有测。
//主函数中收到数据的处理
        u8 cnc_main(void)//主函数中收到数据的处理
{
        u32 t;//字符串标记
        u32 len=0;//总字节
  char num[20];//数据数组
        u8 i=0x00;//数组指针
        double temp=0;//数值

        if(USART_RX_STA&1<<15)//完成接收
                {                                          
                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                       
                        for(t=0;t<len;t++)//每一个char
                        {

//////////////////////////////////////////////
                                if(USART_RX_BUF[t]=='X')//检查X轴   //X123.45
                                {
                                  i=0x00;//数组准备
                                        //确定X轴后取数据
                                        t++;//X字母后的数
                                                        while(1)
                                                        {                                //在0~9之间或包含小数。
                                                                if((USART_RX_BUF[t]>0x2F && USART_RX_BUF[t]<0x3A)||USART_RX_BUF[t]==0x2E)//不为结束  0~9 .
                                                                        {
                                                                                num[i]=USART_RX_BUF[t];//提取
                                                                          t++;
                                                                          i++;//下个char值
                                                                        }
                                                                else
                                                                {
                                                                        num[i]=0x00; break; //数字提取完成
                                                                }
                                                        }
//                                        temp= atoi(num);//数值数组转成 数值
                                                        temp= atof(num);//脉冲数
                                                        if(temp>0&&temp<255)
                                                        {
//                                               time1_init(64800,speed,temp-1);//1us时基, 周期
                                                                 time1_init(72,speed,temp-1);//时基, 周期,脉冲数
                                                        }
                                }
//////////////////////////////////////////////
                                if(USART_RX_BUF[t]=='F')//检查F
                                {
                                        i=0x00;//数组准备
                                        //确定F后取数据
                                        t++;//F字母后的数
                                                        while(1)
                                                        {                                //在0~9之间或包含小数。
                                                                if((USART_RX_BUF[t]>0x2F && USART_RX_BUF[t]<0x3A)||USART_RX_BUF[t]==0x2E)//不为结束  0~9 .
                                                                        {
                                                                                num[i]=USART_RX_BUF[t];//提取
                                                                          t++;
                                                                          i++;//下个char值
                                                                        }
                                                                else
                                                                {
                                                                        num[i]=0x00; break; //数字提取完成
                                                                }
                                                        }
                                        temp= atoi(num);//数值数组转成 数值
                                        speed=temp;//速度
                                }

                               
                                ///////////////////////////
                        }
                        printf("OK\r\n");//插入换行
                       
                        USART_RX_STA=0;//状态复位
                        return 0;
                }
                ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////
//TIM 1 高级定时器
///////time1_init(7200,1000,0);//10khz=0.1ms
//7200是0.1ms,9倍是64800-0.9ms  1秒是1000ms time1_init(64800,1111,9);//1秒周期, 9+1次脉冲
void time1_init(u16 psc,u16 arr,u8 rcr)//定时  tim1//分频,重载,重复
{
        //通道方向 ETRA12         CH1A8        CH2A9     CH3A10       CH4A11
        //BKinB12 CH1NB13      CH2NB14       CH3NB15
////////////////////////////
//参数表
        TIM_TimeBaseInitTypeDef  tim_struct;//基础参数
        NVIC_InitTypeDef NVIC_InitStructure;//中断配置
        TIM_OCInitTypeDef tim_oc;//输出
        TIM_ICInitTypeDef tim_ic;//输入
///////////////////////////////////sys-AHB-APB1-APB2
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//定时器1时钟源72MHz
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);        //使能定时器3时钟
   //tim1 工作  模式
        tim_struct.TIM_ClockDivision=TIM_CKD_DIV4;//ETR引脚TIM_CKD_DIV1;输入分频124  //定时器为72mhz
        tim_struct.TIM_CounterMode=TIM_CounterMode_Up;//上计数        Up                Down
                                                                                                                //#define TIM_CounterMode_Up                 ((uint16_t)0x0000)
                                                                                                                //#define TIM_CounterMode_Down               ((uint16_t)0x0010)
                                                                                                                //#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)//中心对齐1
                                                                                                                //#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)
                                                                                                                //#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)
        tim_struct.TIM_Prescaler=psc-1;//预分频16位65536   。。。。  hz-1
        tim_struct.TIM_Period=arr-1;         //16位重载计数器65535    arr-1
        tim_struct.TIM_RepetitionCounter=rcr;//tim1和8有,重复计数器  N+1
        TIM_TimeBaseInit(TIM1,&tim_struct);//钟源初始化
////////////////////////////////
//输出
                                                                tim_oc.TIM_OCMode=TIM_OCMode_PWM1;//CH输出工作模式
                                                        //#define TIM_OCMode_Timing                  ((uint16_t)0x0000)
                                                        //#define TIM_OCMode_Active                  ((uint16_t)0x0010)
                                                        //#define TIM_OCMode_Inactive                ((uint16_t)0x0020)
                                                        //#define TIM_OCMode_Toggle                  ((uint16_t)0x0030)
                                                        //#define TIM_OCMode_PWM1                    ((uint16_t)0x0060)
                                                        //#define TIM_OCMode_PWM2                    ((uint16_t)0x0070)
                                                                tim_oc.TIM_OutputState=TIM_OutputState_Enable;//CH1开
                                                                tim_oc.TIM_OutputNState=TIM_OutputState_Disable;//CHxN关
                                                                tim_oc.TIM_Pulse=arr/2;//比较器,(占比)超过比较值CH电平会取反。(该值和周期比较)
                                                                //CH在比较值前电平
                                                                tim_oc.TIM_OCPolarity=TIM_OCPolarity_Low;//通道CH1输出起始电平PA8 //TIM_OCPolarity_Low; //TIM_OCPolarity_High;
                                                                tim_oc.TIM_OCNPolarity=TIM_OCNPolarity_Low;//通道1N输出比较前电平
                                                                tim_oc.TIM_OCIdleState=TIM_OCIdleState_Set;//通道CH1空闲状态//TIM_OCIdleState_Set;   Reset;
                                                                tim_oc.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//通道CH1N空闲状态  //TIM_OCIdleState_Reset;
                                                                TIM_OC1Init(TIM1, &tim_oc); //初始化外设 TIM1 OC1
//////////////////////////////////
                //补充项
                                                        TIM_CtrlPWMOutputs(TIM1,ENABLE);//打开pwm脉冲开关(BDTR寄存器)
                                                        TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);//脉冲循环方式,一个轮次脉冲(含RCR重复计算器)TIM_OPMode_Single  ,循环脉冲  TIM_OPMode_Repetitive
                                                               
                                                        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); //cc1新值不立即更新Enable_Disable(CCMR1=0x00)

                                                                //
                                                                //TIM_SetCompare1(TIM1,500); //修改比较值,修改占空比
                                                                //TIM_SetCompare4(TIM1,500); //修改比较值,修改占空比
////////////////////////////////
        //通道方向-输入
        tim_ic.TIM_Channel=TIM_Channel_1;//通道号//TIM_CH1
        tim_ic.TIM_ICPolarity=TIM_ICPolarity_Rising;//TIM1 输入捕获上升沿Rising 下降沿Falling
        tim_ic.TIM_ICSelection=TIM_ICSelection_DirectTI;//引脚复用
        tim_ic.TIM_ICPrescaler=TIM_ICPSC_DIV1;//DIV4捕获每 4 个事件执行一次
        //tim1_ic.TIM_ICFilter= 、、滤波,该参数取值在0x0和0xF之间。
        //TIM_ICInit(TIM1,&tim1_ic);//通道CH1输入初始化

        //TIM_ARRPreloadConfig(TIM1, ENABLE);//预重载开关(结束后更新cnt)
        //

       
        /////////////////////////////////////
        //清中断
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update|    //溢出中断
                                                                                                                                        TIM_IT_CC1|
                                                                                                                                        TIM_IT_CC2|
                                                                                                                                        TIM_IT_CC3|
                                                                                                                                        TIM_IT_CC4|  //捕获中断
                                                                                                                                        TIM_IT_COM|
                                                                                                                                        TIM_IT_Trigger|
                                                                                                                                        TIM_IT_Break);   //  ,触发,打断
                                                                                                                                       
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE );//允许定时器  更新中断
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn; //定时器  中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //抢占优先级 2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; //响应优先级 3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);// 初始化 NVIC
        TIM_Cmd(TIM1,ENABLE); //使能定时器
}
////////////////////////
//tim1中断
void TIM1_BRK_IRQHandler(void)//
{
       
}
void TIM1_UP_IRQHandler(void)//更新中断EGR_ug
{//级别25
       

        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//溢出中断清除
        TIM_Cmd(TIM1,DISABLE); //关 定时器 ENABLE        DISABLE
       
}
void TIM1_TRG_COM_IRQHandler(void)
{
       
}
void TIM1_CC_IRQHandler(void)//比较中断
{

}

//////////////////////////////////




QQ750273008有好的资料记得发给我哦。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-23 13:42:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2020-5-23 13:46:11 | 显示全部楼层
大于400脉冲一圈就没有意义了。电机最小0.9°    一般用1.8°
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2019-6-3
在线时间
103 小时
发表于 2020-5-23 14:04:33 来自手机 | 显示全部楼层
电机有最高转速的要求吧,我手上的最大转速是500转/min
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-5-23 17:49:08 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 04:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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