金牌会员
 
- 积分
- 1635
- 金钱
- 1635
- 注册时间
- 2012-8-28
- 在线时间
- 71 小时
|
今天分享一下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//分频,重载,重复
{
//通道方向 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_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)//比较中断
{
}
//////////////////////////////////
|
|