很多人学单片机是从51或者STM32开始的,但在工业控制、仪器仪表领域,AVR系列的ATmega128其实用得不少。它是Atmel公司(后来被Microchip收购)出的一款8位RISC单片机,128KB Flash、4KB EEPROM、8KB SRAM,资源在8位机里算比较宽裕的,而且AVR的指令集效率很高,同样主频下比51快好几倍。今天就聊聊ATmega128的开发要点,包括寄存器配置、常用外设、以及老工程师踩过的坑。
首先说寄存器。AVR的设计理念就是让用户直接操作硬件寄存器来控制外设,不像STM32有HAL库封装得那么好。好处是代码效率高、执行速度快,坏处是入门门槛高点,得对着数据手册一个寄存器一个位地看。ATmega128的外设寄存器都映射到统一的IO地址空间,每个外设(GPIO、定时器、串口、SPI、I2C、ADC)都有自己的一组配置寄存器和数据寄存器。比如PORTD口的8个引脚,方向寄存器DDRD控制每个脚是输入还是输出,端口寄存器PORTD控制输出高低,引脚寄存器PIND读输入电平。
GPIO的操作很直观。设置为输出:DDRD |= (1 << PD0);输出高电平:PORTD |= (1 << PD0);输出低电平:PORTD &= ~(1 << PD0);读输入状态:if (PIND & (1 << PD1))。如果内部上拉电阻要开,就把对应PIN的PORTD位置1,同时DDRD清0,这样就是输入模式加内部上拉。注意ATmega128有个JTAG接口,如果不用仿真器调试,最好把JTAG口对应的引脚释放出来,熔丝位把JTAGEN关掉,不然PDO、PDI这些脚用不了。
定时器是单片机最常用的外设。ATmega128有三个定时器:Timer0(8位)、Timer1(16位)、Timer2(8位)。16位的Timer1功能最强,可以做PWM输出、输入捕获、输出比较,精度比8位定时器高很多。做电机控制或者需要高精度定时的场景优先用Timer1。PWM的配置步骤:先设置定时器的时钟分频(TCCR1B里的CS10-CS12),然后设置工作模式(TCCR1A的WGM10-WGM11加TCCR1B的WGM12-WGM13,Fast PWM或者Phase Correct PWM选一个),最后设置比较寄存器OCR1A/OCR1B的值来控制占空比。引脚PD5(OC1A)和PD4(OC1B)会自动输出PWM波形,不需要手动翻转IO。
串口通信也是基础。ATmega128有两个独立的串口:UART0和UART1,可以同时跟两个外设通信,比如一个接蓝牙模块,一个接RS485总线。配置步骤:先设波特率(UBRR寄存器),注意UBRR的计算公式跟模式有关,普通模式和双倍速模式不一样,数据手册里有表可以直接查值,别自己算错了。然后设置帧格式(UCSRC里的UCSZ位设置数据位长度,UPM位设置校验位,USBS位设置停止位),再使能发送和接收(UCSRB里的TXEN和RXEN位置1),最后写数据到UDR寄存器发送,或者读UDR寄存器接收。接收的时候记得查RXC标志位或者开接收中断,不然数据会丢。
ADC模块是ATmega128的强项之一。它有8通道10位ADC,精度比51单片机高,采样率最高15kSPS。配置步骤:先在ADMUX寄存器里选通道号(MUX0-MUX3),选择参考电压源(REFS0-REFS1,一般选AVCC作为参考),然后在ADCSRA寄存器里使能ADC(ADEN位置1),设置预分频系数(ADPS0-ADPS2,建议设到8或者16,ADC时钟125kHz-1MHz之间精度最好),最后置位ADSC启动转换。转换完成后ADIF标志位置1,读ADC的低8位和高2位寄存器就行。注意通道切换的时候最好等一次完成再切,或者用自动扫描模式配合中断。
开发环境用什么?Atmel Studio(现在叫Microchip Studio)是官方IDE,集成了GCC编译器和调试器,支持JTAG和PDI两种下载接口。JTAG需要专门的仿真器,PDI用成本低的USBasp或者Arduino Uno就能刷固件。很多人也直接用VS Code加PlatformIO插件开发AVR,编译下载一键搞定,体验比官方IDE好。下载工具推荐USBasp,几块钱一个,支持ISP下载,虽然速度慢点但够用。
最后说几个常见坑点。第一个是熔丝位配置,ATmega128的熔丝位包括低速(SUT_CKSEL)、高速时钟、JTAG使能、看门狗等,配错了可能芯片就变砖了,要用高压编程器才能救回来。改熔丝之前一定要备份原来的配置,建议默认值先用着,有特殊需求再改。第二个是时钟源选择,默认是内部1MHz RC振荡器,精度不高(±10%),对波特率精度有要求的应用(比如串口通信)最好用外部8MHz晶振,把熔丝位CKSEL改成外部时钟。第三个是掉电保存数据,ATmega128的EEPROM擦写寿命有限,设计时注意不要频繁写EEPROM,比如每秒钟都存一次的话,几分钟寿命就用完了,应该用磨损均衡算法或者降低存储频率。第四个是看门狗,生产环境里一定要开看门狗定时器,防止程序跑飞,ATmega128的看门狗可以设置复位时间从16ms到8s不等,配置完别忘了在主循环里定期喂狗。
下一篇:没有了