OpenEdv-开源电子网

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

tim1输出指定脉冲数 RCR重复计数器 脉冲数量

[复制链接]

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2020-5-9 23:26:08 | 显示全部楼层 |阅读模式
买了正点原子4个步进驱动器。 想搞个雕刻机。
G代码解析后是脉冲数。那就需要输出指定的脉冲数量

用tim1的  RCR重复计数器  输出指定的脉冲数

main函数里,初始化好 引脚,再执行一次下面的函数:

        time1_init(64800,1111,(10-1));//0.9ms时基, 周期1秒  脉冲10个

你会发现,PA8引脚输出10个脉冲。 复位一次主板,又会输出10个脉冲
好了,废话不多说,直接上干货:


///////////////////////////////////////
//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_Reset;//通道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_Cmd(TIM1,DISABLE); //关 定时器 ENABLE        DISABLE
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//溢出中断清除
}
void TIM1_TRG_COM_IRQHandler(void)
{
       
}
void TIM1_CC_IRQHandler(void)//比较中断
{

}


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

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2020-5-9 23:28:23 | 显示全部楼层
本帖最后由 750273008 于 2020-5-10 03:33 编辑

仿真时,运行一遍后,再置位 CR1的 CEN会发现再次输出 10个脉冲
G代码解析可以参考我写的这段  X23.15后面记得加空白 就是0x20
M代码解析也和这个一样,还有 F800    R15    G01   G00   X22.033  Y13.546 F800  M03  。。。。。什么的。



if(USART_RX_BUF[t]=='X')//检查X轴   //X123.45
                                {
                                        int i=0x00;
                                        char num[20];
                                        //确定X轴后取数据
                                        t++;//X字母后的数
                                                        while(1)
                                                        {
                                                                if(0x20==USART_RX_BUF[t]||USART_RX_BUF[t]==0x00)//不为结束
                                                                        {
                                                                                num=0x00; break; //数字提取完成
                                                                        }
                                                                num=USART_RX_BUF[t];//提取
                                                                        t++;
                                                                        i++;//下个char值
                                                        }
                                        temp= atoi(num);//数值数组转成 数值
                                                        if(temp>0||temp<255)
                                                        {
                                               time1_init(64800,1111,temp-1);//0.9ms时基, 周期1秒
                                                        }
                                        USART_RX_STA=0;//状态复位
                                        return 0;
                               
                                }

QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

0

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-8-3
在线时间
8 小时
发表于 2020-5-9 23:26:11 | 显示全部楼层
不懂,只能认认真真跟着原子哥学习先,帮顶
回复 支持 反对

使用道具 举报

0

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-7-11
在线时间
1 小时
发表于 2020-5-9 23:30:27 | 显示全部楼层
帮顶,相信大家会帮您解答的
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2020-5-9 23:40:07 | 显示全部楼层
mark1     
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2020-5-10 03:14:01 | 显示全部楼层
if(USART_RX_BUF[t]=='X')//检查X轴   //X123.45
                                {
                                        int i=0x00;
                                        char num[20];
                                        //确定X轴后取数据
                                        t++;//X字母后的数
                                                        while(1)
                                                        {
                                                                if(0x20==USART_RX_BUF[t]||USART_RX_BUF[t]==0x00)//不为结束
                                                                        {
                                                                                num[i]=0x00; break; //数字提取完成
                                                                        }
                                                                num[i]=USART_RX_BUF[t];//提取
                                                                        t++;
                                                                        i++;//下个char值
                                                        }
                                        temp= atoi(num);//数值数组转成 数值
                                                        if(temp>0||temp<255)
                                                        {
                                               time1_init(64800,1111,temp-1);//0.9ms时基, 周期1秒
                                                        }
                                        USART_RX_STA=0;//状态复位
                                        return 0;
                               
                                }
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
 楼主| 发表于 2020-5-10 03:17:20 | 显示全部楼层
if(USART_RX_BUF[t]=='X')//检查X轴   //X123.45
                                {
                                        int i=0x00;
                                        char num[20];
                                        //确定X轴后取数据
                                        t++;//X字母后的数
                                                        while(1)
                                                        {
                                                                if(0x20==USART_RX_BUF[t]||USART_RX_BUF[t]==0x00)//不为结束
                                                                        {
                                                                                num[i]=0x00; break; //数字提取完成
                                                                        }
                                                                num[i]=USART_RX_BUF[t];//提取
                                                                        t++;
                                                                        i++;//下个char值
                                                        }
                                        temp= atoi(num);//数值数组转成 数值
                                                        if(temp>0||temp<255)
                                                        {
                                               time1_init(64800,1111,temp-1);//0.9ms时基, 周期1秒
                                                        }
                                        USART_RX_STA=0;//状态复位
                                        return 0;
                               
                                }
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

2

主题

172

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3142
金钱
3142
注册时间
2014-11-29
在线时间
183 小时
发表于 2020-5-10 08:53:14 | 显示全部楼层
学习一下…………
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-28 10:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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