5、基于 ATMEGA-16 的 ADC 控制 PPM 通道(遥控手柄)

该博客介绍了如何使用 Atmega-16 单片机结合 ADC 控制 PPM 通道,实现遥控手柄功能。在发送端,单片机采集 8 路 ADC 数据并通过串口无线发送,接收端接收数据并将 ADC 值映射到 PPM 通道,完成无线遥控。通过 Proteus 仿真验证了方案的正确性。
摘要由CSDN通过智能技术生成


        前段时间写了关于在 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 <<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值