AVR单片机对舵机的精确控制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void Pwm_init(void) { DDRA|=(1<<5); // 将 OC1A 管脚配置为输出 TCCR1A=0x80; // 相频修正 PWM 模式
TCCR1B=0x12; ICR1H=0x60; // 初始频率 ICR1L=0x80; OCR1AH=0x10; // 初始占空比 OCR1AL=0x80; } void Pwm_vary(void) //PWM 变化输出 { Pwm_s= AD_val/2; OCR1AL= Pwm_s; }
单片机制作
MCU
AVR单片机对舵机的精确控制
●●●
作者 / 赵田
本文介绍 AVR 单片机内部 AD 及对舵机的精确控 制,将一个 10k 的电位器作为控制器,通过 AVR 单片 机(Atmega16)采集电位器输出的模拟量实现舵机角 度的精确调节。
一、Atmega16简介
AVR 单片机是美国 ATMEL 公司生产的增强 RISC、 内载 Flash 的高性能 8 位单片机 , 其中 ATmega16 是 基于增强的 AVR RISC 结构的低功耗 8 位 CMOS 微控 制器。具有 16K 字节的系统内可编程 Flash( 具有同时 读写的能力,即 RWW),512 字节 EEPROM,1K 字节 SRAM,32 个通用 I/O 口线,32 个通用工作寄存器, 用于边界扫描的 JTAG 接口,支持片内调试与编程, 三个具有比较模式的灵活的定时器 / 计数器 (T/C), 片内 / 外中断,可编程串行 USART,有起始条件检测器的 通用串行接口,8 路 10 位具有可选差分输入级可编程 增益 (TQFP 封装 ) 的 ADC ,具有片内振荡器的可编程
看门狗定时器,一个 SPI 串行端口,以及六个可以通 过软件进行选择的省电模式。它执行速度快 , 有良好的 性能价格比 , 因而得到越来越广泛的应用。
二、舵机简介
舵机英文叫 Servo,也称伺服电机。其特点是结构 紧凑、易于安装调试、控制简单、大扭力、成本较低等。 舵机的主要性能取决于最大力矩和工作速度 ( 一般是 以秒 /60 度为单位 ),适用于那些需要角度不断变化并 保持的控制系统。舵机通常采用脉宽调制信号(PWM )控制,既给它提供一定的脉宽,它的输出轴就会保 持在一个相对应的角度上,无论外界转矩怎样改变, 直到给它提供一个另外宽度的脉冲信号,它才会改变 输出角度到新的对应的位置上。其控制信号的周期是 20ms 的脉宽调制(PWM)信号,如图 1 所示其中脉 冲宽度从 0.5~2.5ms,相对应舵盘的位置为 0°~180°角, 呈线性变化。
24 2011. 05 www.ele169.com
单片机制作
MCU
VCC
J1
U1
J3
1 2 3 4 5
VCC D0
D0
D1
D1
D2
D2
D3
D3
D4
D4
6
D5
D5
7
D6
D6
8
D7
D7
9
10
1 2
PB0(T0)
3 PB1(T1)
4 PB2(AIN0)
5 PB3(AIN1)
6 PB4(SS)
7 PB5(MOS1)
五、舵机控制程序分析
在此部分我们使用相位与频率修正 PWM 模式(简 称相频修正 PWM 模式)可以产生高精度的、相位与 频率都准确的 PWM 波形。我们通过 AD 采样得出的 1~500 连续变化的整数来控制输出周期为 20ms,脉宽 为 0.5~2.5ms 的脉冲,进而控制舵机由 -90°~90°角的 连续变化。
2011. 05
25
单片机制作
MCU
void ADC_init(void) //AD 初始化子函数 { ADCSRA = 0xE4; //ADC 使能;ADC 开始转换; 连续转换 ;64 分频 ADCSRA |= (1<<ADEN)|(1<<ADSC )|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1); 可 采 用 ADC 中断 ADMUX = 0xC0; // 内部 2.56V 参考电压 ;输 入通道为 PD0 ;输出结果右对齐 } uint ADC_convert(void) // 模数转换子函数 { uint temp1,temp2; temp1=(uint)ADCL; temp2=(uint)ADCH; // 取得模数转换值 temp2=(temp2<<8)+temp1; return(temp2); } uint Conv(uint i) // 数据转换子函数 { long x; uint y; x=(5000*(long)i)/1024; // 将变量 i 转换成需要 现实的形式 1024 份 =2 的 10 次方(低 8 位高两位) y=(uint)x; //x 强制转换成整型 return y; }
六、主函数
int main(void) { port_init(); // 端口初始化 adc_init(); timer0_init(); Pwm_init(); // 初始化定时器 while(1) { if(cnt>10) { adc_val=ADC_convert(); dis_val=Conv(adc_val); AD_val=dis_val/10; cnt=0; } delay(1000); Pwm_vary(); } }
8 PB6(MIS0)
PB7(SCK)
VCC
PA0(ADC0) PA1(ADC1) PA2(ADC2) PA3(ADC3) PA4(ADC4) PA5(ADC5) PA6(ADC6) PA7(ADC7)
VCC 40 APC0 39 APC1 38 LEDLK
37 SECLK
36 BITLK 35 18820 34 BEEP 33 CSLSB
1 2 3 4 5 6 7 8 9 10
PH J2
1 2 3 4 5 6 7 8 9 10
RXD TXD INT0 INT1 PD4 PD5 PD6 PD7
VCC RXD
14
TXD 15
INT0 16
INT1 17
PD4 18
PD5 19
PD6 20百度文库
PD7 21
RESET 9
PD0(RXD) PD1(TXD) PD2(INT0) PD3(INT1) PD4(0C1B) PD5(0C1A) PD6(ICP) PD7(TOSC2)
PD
X1
13 X1
X2
12 X2
31 GND 30 AVCC
PC
3k 3k 3k R3 R4 R5
RESET C1
C2 22PF C3 22PF
VCC
R21K R8
10k
X1
Y1 8MH2 X2
RESET
VCC
VCC
JP1
1 3 5 7 9
VCC
2 4 6 8 10
VCC D5 D6 D7 RESET
JP2
10
9 TD1
RESET VCC
8 6 4 2
7 5
TMS VCC
3 TD0
1 TCK
图2 Atmega16最小系统
J2
PD5 1
VCC
2
3
DJ
ADC0
VCC R1 10k
图3 舵机及AD输入
四、AD采样程序分析
在这里采用 Atmega16 片内 2.56V 的基准电压,0 通道输入连续转换模式。在默认条件下,逐次逼近电 路需要一个从 50 kHz 到 200 kHz 的输入时钟以获得最 大精度,ADC 模块包括一个预分频器,它可以由任何 超过 100 kHz 的 CPU 时钟来产生可接受的 ADC 时钟, 在此我们选用 8M 晶振 64 分频。ADC 通过逐次逼近的 方法将输入的模拟电压转换成一个 10 位的数字量,存 放于 ADC 数据寄存器 ADCH 及 ADCL 中,我们只要读 取这个数字量并转换成所需整型即可,具体过程由以下 程序完成。
输入正脉冲宽度(周期为20ms) 0.5ms
伺服电机输出臂位置
~ -90°
1.0ms
~ -45°
1.5ms
~ 0°
2.0ms
~ 45°
2.5ms
~ 90°
图1 舵机输出转角与输入信号脉冲宽度的关系
三、硬件连接
Atmega16 最小系统见图 2 所示,在此我们采用 Atmega16 的 PA0(ADC0)口作为控制器的输入端连 接电位器中间一脚,电位器两边引脚分别接电源 VCC 和 GND。旋转电位器便可输出连续变化的电压,此时 通过 Atmega16 内部 10 位精度的 AD 实时采样,将输 入的模拟量进行转化,进而调节 PWM 的输出占空比。 舵机共有三根输入线,分别是电源线 VCC、地线 GND 和控制信号线(见图 3)。在这里我们采用 Atmega16 的 16 位定时器 / 计数器实现 PWM 信号的精确输出。
REST
PC0(SCL) PC1(SDA) PC2(TCK) PC3(TMS) PC4(TD0) PC5(TDI) PC6(T0SC1) PC7(T0SC2)
22 SCL 23 SDA 24 TCK 25 TMS 26 TD0 27 TD1 28 PC6 29 PC7
VCC
32 AREF
PA J4
1 2 3 4 5 6 7 8 9 10
END
26 2011. 05 www.ele169.com