前段时间写了关于在 Atmega 平台上的 PPM 信号的产生,现在结合 ADC 程序, 给出一个遥控手柄的方案。在发送端,单片机采集 8 路 ADC,然后将数据通过串口发送出去(连接上无线串口模块,就能实现无线遥控的功能了),接收端通过接收串口的数据,将其每一路 ADC 的数据对应到 PPM 的每个通道上,从而实现每一路 ADC 控制遥控器的一个通道。通过 Proteus 仿真,最后得出了正确的结果。
1、发送端主要程序
void AdcInit(void)
{
/* ---------------- GPIO 设置 ----------------*/
PORTA = 0x00; /* PORTA 全部设置为输入口 */
DDRA = 0x00; /* 设置为高阻态 */
/* ---------------- ADC 设置 ----------------*/
ADMUX = 1 << REFS0; /* 参考电压为 AVcc, 右对齐, 选择 ADC0 通道 */
/* 使能 ADC, ADC 中断使能, 时钟 8 分频 */
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS1) | (1 << ADPS0);
/* 启动 ADC 转换 */
ADCSRA |= (1 << ADSC);
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void)
{
/* 读取 ADC 数据 */
AdcData[Adc_Channel] = ((ADCH & 0x03) << 8) | ADCL;
/* 保存数据 */
Frame_Dat[(Adc_Channel + 1)*2] = AdcData[Adc_Channel] / 256;
Frame_Dat[(Adc_Channel + 1)*2 + 1] = AdcData[Adc_Channel] % 256;
/* 下一个通道 */
if (++Adc_Channel >= 8)
{
Adc_Channel = 0;
}
/* 设置下一个转换通道 */
ADMUX &= 0xE0;
ADMUX |= Adc_Channel;
/* 启动下一次转换 */
ADCSRA |= (1 << ADSC);
}
#include <iom16v.h>
#include <macros.h>
#include <stdio.h>
#include "uart.h"
#include "data.h"
#include "adc.h"
void Timer0_Init(void)
{
TCCR0 = 0x00;
TCNT0 = 256 - 125; /* 125 / 31250 = 4ms */
TIMSK |= 1 <<