智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3332|回复: 9
打印 上一主题 下一主题

[咨询] 大侠们:龙丘的AD程序怎么用不了?

[复制链接]

45

主题

171

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1704
QQ
威望
1032
贡献
200
兑换币
353
注册时间
2012-10-1
在线时间
236 小时
跳转到指定楼层
1#
发表于 2012-11-23 22:36:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题

5

主题

55

帖子

0

精华

高级会员

Rank: 4

积分
845
威望
505
贡献
194
兑换币
113
注册时间
2011-12-11
在线时间
73 小时
2#
发表于 2012-11-23 22:43:03 | 只看该作者
发出来
回复 支持 反对

使用道具 举报

45

主题

171

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1704
QQ
威望
1032
贡献
200
兑换币
353
注册时间
2012-10-1
在线时间
236 小时
3#
 楼主| 发表于 2012-11-23 22:47:59 | 只看该作者
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;
}

回复 支持 反对

使用道具 举报

7

主题

563

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4530
QQ
威望
2516
贡献
1044
兑换币
592
注册时间
2011-9-24
在线时间
485 小时
4#
发表于 2012-11-24 12:46:09 | 只看该作者
JJ Burst
回复 支持 反对

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
5#
发表于 2012-11-27 19:15:38 | 只看该作者
直接下载就可以了,那些工程都是实测过的,检查下接线是否正确。
回复 支持 反对

使用道具 举报

6

主题

110

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1037
威望
387
贡献
590
兑换币
8
注册时间
2011-2-16
在线时间
30 小时
6#
发表于 2012-11-28 13:05:36 | 只看该作者
chiusir 发表于 2012-11-27 19:15
直接下载就可以了,那些工程都是实测过的,检查下接线是否正确。

哈哈,估计是步骤不对
回复 支持 反对

使用道具 举报

45

主题

171

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1704
QQ
威望
1032
贡献
200
兑换币
353
注册时间
2012-10-1
在线时间
236 小时
7#
 楼主| 发表于 2012-12-30 16:41:09 | 只看该作者
chiusir 发表于 2012-11-27 19:15
直接下载就可以了,那些工程都是实测过的,检查下接线是否正确。

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

使用道具 举报

21

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
613
威望
331
贡献
158
兑换币
190
注册时间
2012-12-13
在线时间
62 小时
8#
发表于 2013-1-12 11:29:54 | 只看该作者
我也是同样的问题,我想不用串口通信  用滑动变阻来做单端输入  用指示灯来看效果 但是失败了 ,请问最简单应该怎么改
回复 支持 反对

使用道具 举报

80

主题

1045

帖子

0

精华

跨届大侠

北京龙邱智能科技有限公司

Rank: 10Rank: 10Rank: 10

积分
10332

论坛元老奖章

QQ
威望
2905
贡献
6151
兑换币
4515
注册时间
2008-6-7
在线时间
638 小时
9#
发表于 2013-1-18 00:49:01 | 只看该作者
启动的时候需要设置一个变量记录这个初始值,然后通过采集跟这个数值比较,就知道倾斜的方向和大小了,有的同学用的是自调整的,也不错的。
回复 支持 反对

使用道具 举报

12

主题

621

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6697
威望
4237
贡献
746
兑换币
2329
注册时间
2011-7-22
在线时间
857 小时
10#
发表于 2013-1-18 01:11:56 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-8 13:39 , Processed in 0.090958 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表