还在玩流水灯?来学学怎么如何发PWM脉冲驱动伺服电机做精确定位控制.
1.修改汇川伺服驱动器(IS620P)以下参数
H02-00: 1 位置控制模式
H05-00: 0 脉冲指令
H05-01: 0 脉冲指令选择低速端子输入
H05-02: 10000 电机旋转一圈的脉冲数量
H05-15: 3 脉冲形态 CW+CCW
H05-17: 2500 编码器分频脉冲数
2.NV32F101单轴与伺服IO硬件连接
NV32 IS620P
PD0----------------------S-ON 伺服使能
PD1----------------------ALM+ 伺服报警
PH0----------------------CW A相 正转脉冲
PH1----------------------CCW B相 反转脉冲
3.NV32F101单轴板软件程序
设置PD0为输出端口,当PD0为高电平伺服电机使能,PD0为低电平伺服电要失能
设置PD1为输入端口,当PD1为高电平伺服电机报警状态,PD1为低电平伺服电机正常状态
void IO_INIT()
{
GPIO_PinInit(GPIO_PTD0, GPIO_PinOutput);
GPIO_PinInit(GPIO_PTD1, GPIO_PinInput);
}
PWM初始化设置
void PWM_Config()
{
SIM_RemapETM2CH1Pin(); //映射ETM2_CH1至PH1 PWM脉冲输出通道1
SIM_RemapETM2CH0Pin(); //映射ETM2_CH0至PH0 PWM脉冲输出通道0
ETM_PWMInit(ETM2, ETM_PWMMODE_EDGEALLIGNED, ETM_PWM_LOWTRUEPULSE); //ETM2被设置为边沿对齐PWM脉冲
///关闭其它不用的6个PWM通道//////////
ETM_disblechannel(ETM2,2);
ETM_disblechannel(ETM2,3);
ETM_disblechannel(ETM2,4);
ETM_disblechannel(ETM2,5);
ETM_disblechannel(ETM2,6);
ETM_disblechannel(ETM2,7);
NVIC_SetPriority(ETM2_IRQn,0); //设置ETM2中断为0,最高优先级
NVIC_EnableIRQ(ETM2_IRQn); //打开ETM2中断
ETM_SetCallback(ETM2, PWM_Task); //设置中断回调函数
}
ETM2 中断对PWM脉冲进行计数,当数量相等关闭PWM脉冲输出
uint32_t PWMcount;
void PWM_Task(void)
{
PWMcount++;
if(PWMcount==20000)
{
ETM_ClockSet(ETM2,ETM_CLOCK_NOCLOCK,ETM_CLOCK_PS_DIV1); //关闭ETM2时钟
ETM_DisableOverflowInt(ETM2); //关闭ETM2溢出中断
}
ETM_ClrOverFlowFlag(ETM2); //清除溢出标志位
}
主函数
int main (void)
{
/*系统初始化*/
sysinit();
cpu_identify();
IO_INIT();
PWM_Config();
GPIO_PinSet(GPIO_PTD0);//使能伺服电机
ETM_SetModValue(ETM2, 479); //PWM脉冲频率100K 48000000(48M)/100000=480-1=479
ETM_SetChannelValue(ETM2, ETM_CHANNEL_CHANNEL1, 120);
ETM_ClockSet(ETM2, ETM_CLOCK_SYSTEMCLOCK, ETM_CLOCK_PS_DIV1);
ETM_EnableOverflowInt(ETM2);
while(1)
{
}
}
|