金牌会员
 
- 积分
- 1635
- 金钱
- 1635
- 注册时间
- 2012-8-28
- 在线时间
- 71 小时
|
买了正点原子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//分频,重载,重复
{
//通道方向 ETR A12 CH1 A8 CH2 A9 CH3 A10 CH4 A11
//BKin B12 CH1N B13 CH2N B14 CH3N B15
////////////////////////////
//参数表
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)//比较中断
{
}
|
|