智能车制作

标题: 大侠们:龙丘的AD程序怎么用不了? [打印本页]

作者: 百花园林2011    时间: 2012-11-23 22:36
标题: 大侠们:龙丘的AD程序怎么用不了?
如题

作者: zasray    时间: 2012-11-23 22:43
发出来
作者: 百花园林2011    时间: 2012-11-23 22:47
zasray 发表于 2012-11-23 22:43
发出来

/********************************************************   
【平    台】龙丘K60X256多功能开发板
【编    写】龙丘
【Designed】by Chiu Sir
【E-mail  】chiusir@yahoo.cn
【软件版本】V1.0
【最后更新】2012年1月5日
【相关信息参考下列地址】
【网    站】http://www.lqist.cn
【淘宝店铺】http://shop36265907.taobao.com
------------------------------------------------
【dev.env.】CodeWarrior 10.1/IAR
【Target  】K60X256
【Crystal 】50.000Mhz
【busclock】???.000MHz
【pllclock】100.000MHz   
***************************
------------------------------------
  使用说明:
PTD6接串口模块的RX
PTD7接串口模块的TX
串口波特率9600n,n,8,1
在串口调试助手窗口发送任意字符,返回相应字符加1。
AD0通道为10位ADC,接3.3V时为1023
AD1通道为16位ADC,接3.3V时为65535
  
*********************************************************/
//头文件
#include "includes.h"
//全局变量声明
extern int periph_clk_khz;
#define ADchannel 16
#define ADchanne23 23
uint8 cycle_flags = 0;
uint16 result0A,result0B,result1A,result1B;
//该结构体包含了需要的ADC/PGA配置
tADC_Config Master_Adc_Config;
void delays(uint16 z)
{
  uint16 i=0,j=0;
  for(i=0;i<z;i++)
    for(j=0;j<1100;j++);
}
//主函数
void main(void)
{
    //1 主程序使用的变量定义     
    uint32 runcount;  //运行计数器
    uint16 ADValue;   
     
    //2 关中断
    DisableInterrupts;     //禁止总中断
    PORTA_PCR17 = PORT_PCR_MUX(0x5);
   
    //3 模块初始化
    light_init(Light_Run_PORT,Light_Run1,Light_OFF); //指示灯初始化
    uart_init (UART0,periph_clk_khz,9600);      //串口初始化
    //ADC
    hw_adc_init(0);   
    hw_adc_init(1);  
   
    uart_sendstring(UART0, (uint8 *)"Welcome to K60 ADC Example\r\n");
    uart_sendstring(UART0,(uint8 *)"Preparing for ADC operate!\r\n");
    uart_sendstring(UART0,(uint8 *)"Start ADC0.......\taccuracy is 10.\r\n");
    uart_sendstring(UART0,(uint8 *)"Start ADC1.......\taccuracy is 16.\r\n");
    //主循环
    while(1)
    {
        //1 主循环计数到一定的值,使小灯的亮、暗状态切换
        runcount++;
        if(runcount>=10)
        {
            light_change(Light_Run_PORT,Light_Run1);//指示灯的亮、暗状态切换
            runcount=0;
        }
        //进行一次模块0通道16采样
        ADValue = hw_ad_ave(0, ADchannel,10,10);
        uart_sendstring(UART0,(uint8 *)"\r\n");
        uart_sendnumber(UART0, ADValue);
        
      
            
        //进行一次模块1通道16采样
        uart_sendstring(UART0,(uint8 *)"\t---------------");
        ADValue = hw_ad_ave(1, ADchannel,10,10);
        uart_sendnumber(UART0, ADValue);
        delays(25000);
                    
    }
}







//============================================================================
//函数名称:hw_adc_init
//函数返回:0 成功 ,1 失败
//参数说明:MoudelNumber:模块号
//功能概要:AD初始化
//============================================================================
uint8 hw_adc_init(int MoudelNumber)
{
    if(MoudelNumber == 0)//模块0
    {
        SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK );//使能ADC的时钟,使能ADC通道的引脚复用功能为ADC功能
        SIM_SOPT7 &= ~(SIM_SOPT7_ADC0ALTTRGEN_MASK  |
                      SIM_SOPT7_ADC0PRETRGSEL_MASK);//0x80u交替触发选择ADC0//  0x10u
        SIM_SOPT7 = SIM_SOPT7_ADC0TRGSEL(0);
    }
    else if(MoudelNumber == 1)//模块1
    {      
        SIM_SCGC3 |= (SIM_SCGC3_ADC1_MASK );
        SIM_SOPT7 &= ~(SIM_SOPT7_ADC1ALTTRGEN_MASK  |
                      SIM_SOPT7_ADC1PRETRGSEL_MASK) ;
        SIM_SOPT7 = SIM_SOPT7_ADC1TRGSEL(0);
    }
    else
    {
        return 0;
    }
   
    return 1;
}

//============================================================================
//函数名称:hw_ad_once
//函数返回:无符号结果值(范围:0-4095)
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//              accuracy:精度
//功能概要:采集一次一路模拟量的AD值   
//============================================================================
uint16 hw_ad_once(int MoudelNumber,int Channel,uint8 accuracy)//采集某路模拟量的AD值
{
    uint16 result = 0;
    //开始ADC转换
    hw_adc_convertstart(MoudelNumber, Channel, accuracy);
    if(MoudelNumber == 0)
    {
        while (( ADC0_SC1A & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK)
        {
        }
        result = ADC0_RA;        
        ADC0_SC1A &= ~ADC_SC1_COCO_MASK;
    }
    else
    {
        while (( ADC1_SC1A & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK)
        {
        }
        result = ADC1_RA;        
        ADC1_SC1A &= ~ADC_SC1_COCO_MASK;
    }
    return result;
}
//============================================================================
//函数名称:hw_ad_mid
//函数返回:无符号结果值(范围:0-4095)
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//              accuracy:精度
//功能概要:中值滤波后的结果(范围:0-4095)
//============================================================================
uint16 hw_ad_mid(int MoudelNumber,int Channel,uint8 accuracy) //中值滤波
{
uint16 i,j,k,tmp;
//1.取3次A/D转换结果
i = hw_ad_once(MoudelNumber,Channel,accuracy);
j = hw_ad_once(MoudelNumber,Channel,accuracy);
k = hw_ad_once(MoudelNumber,Channel,accuracy);
//2.取中值
if (i > j)
{
  tmp = i; i = j; j = tmp;
}
if (k > j)
   tmp = j;
else if(k > i)
   tmp = k;
    else
      tmp = i;
return tmp;
}
//============================================================================
//函数名称:hw_ad_ave
//函数返回:无符号结果值(范围:0-4095)
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//              accuracy:精度
//                     N:均值滤波次数(范围:0~255)
//功能概要:均值滤波后的结果(范围:0-4095)
//============================================================================
uint16 hw_ad_ave(int MoudelNumber,int Channel,uint8 accuracy,uint8 N) //均值滤波
{
uint32 tmp = 0;
uint8  i;
    for(i = 0; i < N; i++)
  tmp += hw_ad_mid(MoudelNumber,Channel,accuracy);
tmp = tmp / N;
    return (uint16)tmp;
}
//============================================================================
//函数名称:hw_adc_convertstart
//函数返回:0 成功 ,1 失败
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//              accuracy:精度
//功能概要:开始adc转换
//============================================================================
uint8 hw_adc_convertstart(int MoudelNumber,int Channel,uint8 accuracy)
{
    uint8 ADCCfg1Mode = 0;
   
    switch(accuracy)
    {
      case 8:
        ADCCfg1Mode = 0x00;
        break;
      case 12:
        ADCCfg1Mode = 0x01;
        break;
      case 10:
        ADCCfg1Mode = 0x02;
        break;
      case 16:
        ADCCfg1Mode = 0x03;
        break;
      default:
        ADCCfg1Mode = 0x00;
    }
   
  
    //初始化ADC默认配置
    Master_Adc_Config.CONFIG1  = ADLPC_NORMAL
                              | ADC_CFG1_ADIV(ADIV_4)
                              | ADLSMP_LONG
                              | ADC_CFG1_MODE(ADCCfg1Mode)
                              | ADC_CFG1_ADICLK(ADICLK_BUS);
    Master_Adc_Config.CONFIG2  = MUXSEL_ADCA
                              | ADACKEN_DISABLED
                              | ADHSC_HISPEED
                              | ADC_CFG2_ADLSTS(ADLSTS_20) ;
    Master_Adc_Config.COMPARE1 = 0x1234u ;                 //任意值
    Master_Adc_Config.COMPARE2 = 0x5678u ;                 //任意值
                                                         
   
    if(MoudelNumber == 0)
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC0
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置 ADC0
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置ADC0
        }
        else
        {
            return 0;
        }
    }
    else
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC1
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC1_BASE_PTR, &Master_Adc_Config);  // 配置ADC1
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(Channel);
            hw_adc_config_alt(ADC1_BASE_PTR, &Master_Adc_Config);  // 配置ADC1
        }
        else
        {
            return 0;
        }
    }
    return 1;
}
//============================================================================
//函数名称:hw_adc_config_alt
//函数返回:无符号结果值(范围:0-4095)
//参数说明:adcmap:adc基址寄存器地址
//          ADC_CfgPtr: 存放 寄存器值的结构体   
//功能概要:将adc寄存器结构体配置进adc寄存器
//============================================================================
void ADC_Config_Alt(ADC_MemMapPtr adcmap, tADC_ConfigPtr ADC_CfgPtr)
{
    ADC_CFG1_REG(adcmap) = ADC_CfgPtr->CONFIG1;
    ADC_CFG2_REG(adcmap) = ADC_CfgPtr->CONFIG2;
    ADC_CV1_REG(adcmap)  = ADC_CfgPtr->COMPARE1;
    ADC_CV2_REG(adcmap)  = ADC_CfgPtr->COMPARE2;
    ADC_SC2_REG(adcmap)  = ADC_CfgPtr->STATUS2;
    ADC_SC3_REG(adcmap)  = ADC_CfgPtr->STATUS3;
    ADC_PGA_REG(adcmap)  = ADC_CfgPtr->PGA;
    ADC_SC1_REG(adcmap,A)= ADC_CfgPtr->STATUS1A;      
    ADC_SC1_REG(adcmap,B)= ADC_CfgPtr->STATUS1B;
}
void hw_adc_config_alt(ADC_MemMapPtr adcmap, tADC_ConfigPtr ADC_CfgPtr)
{
    ADC_CFG1_REG(adcmap) = ADC_CfgPtr->CONFIG1;
    ADC_CFG2_REG(adcmap) = ADC_CfgPtr->CONFIG2;
    ADC_CV1_REG(adcmap)  = ADC_CfgPtr->COMPARE1;
    ADC_CV2_REG(adcmap)  = ADC_CfgPtr->COMPARE2;
    ADC_SC2_REG(adcmap)  = ADC_CfgPtr->STATUS2;
    ADC_SC3_REG(adcmap)  = ADC_CfgPtr->STATUS3;
    ADC_PGA_REG(adcmap)  = ADC_CfgPtr->PGA;
    ADC_SC1_REG(adcmap,A)= ADC_CfgPtr->STATUS1A;      
    ADC_SC1_REG(adcmap,B)= ADC_CfgPtr->STATUS1B;
}
//============================================================================
//函数名称:hw_adc_convertstop
//函数返回:0 成功 ,1 失败
//参数说明:MoudelNumber:模块号
//               Channel:通道号
//功能概要:停止ADC转换  
//============================================================================
uint8 hw_adc_convertstop(int MoudelNumber,int Channel)
{
    if(MoudelNumber == 0)
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC0
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置ADC0
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);  // 配置ADC0
        }
        else
        {
            return 0;
        }
    }
    else if(MoudelNumber == 1)
    {
        if(Channel>3&&Channel<24)                             //4~23 使用 ADC1
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC1_BASE_PTR, &Master_Adc_Config);  //  配置ADC1
        }
        else if(Channel == 26)
        {
            Master_Adc_Config.STATUS1A = AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(0x1F);
            ADC_Config_Alt(ADC1_BASE_PTR, &Master_Adc_Config);  //  配置ADC1
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 0;
    }
    return 1;
}


作者: Mr_Q    时间: 2012-11-24 12:46
JJ Burst
作者: chiusir    时间: 2012-11-27 19:15
直接下载就可以了,那些工程都是实测过的,检查下接线是否正确。
作者: blueskywalker    时间: 2012-11-28 13:05
chiusir 发表于 2012-11-27 19:15
直接下载就可以了,那些工程都是实测过的,检查下接线是否正确。

哈哈,估计是步骤不对

作者: 百花园林2011    时间: 2012-12-30 16:41
chiusir 发表于 2012-11-27 19:15
直接下载就可以了,那些工程都是实测过的,检查下接线是否正确。

请问贵店的
轴陀螺仪ENC-03MB三轴模拟加速度MMA7361模块,输出来的是角度,要设置零偏时候,要让车保持于重力平衡的位置么,

作者: 忍冬草    时间: 2013-1-12 11:29
我也是同样的问题,我想不用串口通信  用滑动变阻来做单端输入  用指示灯来看效果 但是失败了 ,请问最简单应该怎么改
作者: chiusir    时间: 2013-1-18 00:49
启动的时候需要设置一个变量记录这个初始值,然后通过采集跟这个数值比较,就知道倾斜的方向和大小了,有的同学用的是自调整的,也不错的。
作者: k40368    时间: 2013-1-18 01:11





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2