2015-12-24 浏览量 1952
利用单片机控制伺服电机,可以使用集成了带有PWM功能定时/计数器。但这种方式有它固有的诸多缺点,在需要控制的伺服电机比较多,运动关系复杂的情况下,这种方式是不适用的。本系统利用了ATmega16单片机内部集成的定时/计数器,以及非易失性存储介质EEPROM和UART接口设计了多路伺服电机控制器。
控制器用串口与上位机电脑进行通信,通过电脑的串口调试软件发出指令,选择实时在线调试,批量发送动作指令并存储在单片机的EEPROM中,或单片机按照指令自动控制各路伺服电机运动。
系统选用ATmega16单片机的一个8位计数器Timer0和一个16位计数器Timer1协调工作,利用单片机的I/O接口产生出可以控制单片机的PWM信号。各伺服电机可以协调地运动。这种控制方法使得单片机有多少空余的I/0口,就能控制多少路伺服电机。控制电机的数量根据具体应用而定,其余的I/O接口可以用来连接传感器等器件,利于功能扩展。
硬件设计
电路主要包括电源、单片机最小系统、伺服电机接口、RS-232接口电路、其他器件接口等几个部分,见图。
系统采用两种电源模式:一种是伺服电机和单片机共用同一个电源。由于AVR系列单片机抗干扰能力强,功耗小,在伺服电机数量比较少的情况下,可以使用这种方式。另一种方式是伺服电机和单片机采用独立电源,分别由各自的电源系统供电。两种方式通过跳线选择。系统输入电压为6V,单片机的电源采用LM1117低压差稳压器获取5V电压。
ATmega16单片机有一路串口可以与外界通信。系统采用MAX232芯片将单片机的TTL电平转换为-10V~15V的RS-232电平。
最小系统包括单片机复位电路、时钟电路,以及在系统编程(ISP)接口。系统使用8MHz石英晶体作为外部时钟源。
软件部分由主程序、定时/计数器和I/O接口控制部分以及串口通信部分组成。采用C语言编写程序,流程图见图。程序在EEPROM中开辟一个30×16的二维数组,用来存放自动运行时,各伺服电机运动的相应值。各值存放在数组的第二维,可存放的动作序列有30组。
主程序主要完成单片机片上硬件的初始化以及应用控制程序部分。系统初始化内容包括:用于控制伺服电机的I/O接口设置为输出,低电平;其他I/0口设为输入。Timer0和Timer1使能,Timer0使用主系统时钟8分频,Tiner1使用主系统时钟不分频,定时器同I/O口不相连,溢出中断。UART接口使能,接收中断。
主程序还完成读取串口的值,确定用户需要实时调试还是批量输入指令,还是自动运行,并执行相应程序。 TimerO和,Timer1交替使用,在使用一个计数器时关闭另一个计数器。由于TimerO的时钟频率高,计数值小,因此,Timer0首先溢出中断。在中断中关闭,Tiner1,把代表各电机位置的变量值与一个用于控制各I/O接口电平时间的变量比较。如果超过它,就将该口电平设为低电平,否则为高电平。然后将这一用于比较的变量自加1。重新设置Timer0计数初值。这样Timer0就不断地中断,不断把代表各电机位置的变量同用于比较的变量比较,使各控制端口高电平时间根据需要在0.5ms~2.5ms之间,直到所有接口高电平时间都结束,禁能Timer0,使能Tliner1。利用Timer1控制低电平时间,使得方波周期为18ms~20ms。
自动状态下,系统按照EEPROM中存放的指令控制伺服电机运动。实时调试指令模式下,程序把串口读到的16个数据分别赋给代表伺服电机位置的16个变量,定时器会自动产生相应的控制信号。如果需要存放指令,只需要把串口读到的数据分别赋给在EEPROM中开辟二维数组的第二维。如果指令更多,可以采用外部扩展EEPROM的方法进行存储空间扩展。
总结
通过测试,该系统性能可靠。系统采用单片机两个定时器联合工作的方法,利用中断程序,产生了多路伺服电机控制信号。与一般所采用的直接使用定时器PWM功能的方法相比,本系统可控制电机路数多,控制简单,通过设置各变量的值就可以控制伺服电机运动到相应位置。
安昂自营
安昂自营
安昂自营
安昂自营
安昂自营
安昂自营
安昂自营
安昂自营
安昂自营
安昂自营