dsPIC33EP ADC模块初始化及应用实例
//文件名 p33adc.h
#ifndef _P33ADC_H_
#define _P33ADC_H_
//#include "p33adc.h"
//--AD1CON1
#define ADON (1<<15)
#define MAUTO (7<<5) //采样后 自动转换模式
#define SAMP (1<<1)
#define DONE (1<<0)
//ADC时钟选择--时钟分频
#define ADC_DIV1 (1-1)
#define ADC_DIV5 (5-1)
#define ADC_DIV10 (10-1)
#define ADC_DIV25 (25-1)
#define ADC_DIV50 (50-1)
#define ADC_DIV100 (100-1)
#define ADC_DIV250 (250-1)
//--AD通道选择------
#define ADC_Chanel0 (0x00<<0)
#define ADC_Chanel1 (0x01<<0)
#define ADC_Chanel2 (0x02<<0)
#define ADC_Chanel3 (0x03<<0)
#define ADC_Chanel4 (0x04<<0)
#define ADC_Chanel5 (0x05<<0)
#define ADC_Chanel6 (0x06<<0)
#define ADC_Chanel7 (0x07<<0)
#define ADC_Chanel8 (0x08<<0)
#define ADC_Chanel9 (0x09<<0)
#define ADC_Chanel10 (0x0A<<0)
#define ADC_Chanel11 (0x0B<<0)
#define ADC_Chanel12 (0x0C<<0)
#define ADC_Chanel13 (0x0D<<0)
#define ADC_Chanel14 (0x0E<<0)
#define ADC_Chanel15 (0x0F<<0)
//================================
extern void Init_Adc(uint16 ClkDiv) ;
extern uint16 AdcSwitch(uint16 Adc_Ch) ;
#endif
//文件名 p33adc.c
#include "global.h"
//#include "p33adc.h"
//***************************************
// 函数名称:Init_Adc
// 函数功能:初始化ADC模块
// 入口参数:
// 出口参数:无
// 返回值:无
// ADC时钟来源于Fcpu
//***************************************
void Init_Adc(uint16 ClkDiv)
{
AD1CON1 = 0X0000|MAUTO; //设置为自动模式 10位4通道模式 数据右对齐
AD1CON2 = 0X0000 ;
AD1CON3 = 0X0000 | ClkDiv |0X8000; //ADC时钟分频
AD1CON4 = 0X0000 ; //不使能DMA 每个通道分一个字的缓存
AD1CHS123 = 0X0000 ;
AD1CHS0 = 0X0000 ;
AD1CSSH = 0X0000 ;
AD1CSSL = 0X0000 ;
AD1CON1 |= ADON ; //开启ADC模块工作
asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;//延时
asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;
}
//***************************************
// 函数名称:AdcSwitch
// 函数功能:选择AD通道转换
// 入口参数:
// 出口参数:无
// 返回值:无
//***************************************
uint16 AdcSwitch(uint16 Adc_Ch) // ADRESH ADRESL
{
uint16 wTmp ;
AD1CON1 |= ADON ; //开启ADC模块工作
AD1CHS0 = (AD1CHS0 & 0XFFE0)|Adc_Ch ;//选择通道
asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;//延时
asm("nop") ;asm("nop") ;asm("nop") ;asm("nop") ;
AD1CON1 &= ~DONE ; //ADC空闲
AD1CON1 |= SAMP ; //开始转换
while(!(AD1CON1 & DONE)) ; //等待转换完成
// AD1CON1 &= ~DONE ; //ADC空闲
wTmp = ADC1BUF0 & 0X03FF ; //读取转换结果
return wTmp ;
}
//应用实例
void main(void)
{
uint16 g_wTmp1 ;
//初始化ADC
Init_Adc(ADC_DIV25) ;//AD模块时钟输入频率 10BIT AD
while(1)
{
g_wTmp1 = AdcSwitch(ADC_Chanel0) ;//读取转换结果
}
}
补充:软件开发 , C++ ,