国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

12
返回列表 發新帖
樓主: hotpower
打印 上一主題 下一主題

補充一些IAR AVR常用的H和CPP文件

[復制鏈接]
21
 樓主| 發表于 2009-4-2 23:41:54 | 只看該作者
adc.cpp(略)
hotpower 發表于 2007-8-23 02:26 AVR 單片機 ←返回版面   舉報該貼

#include "adc.h"

AdcObj::AdcObj(void)
{
  Init();
}

/*----------------------------------------------------
R0 = 10K, R1 = 51K, Vref = 2.50V
公式:Vx = Vref * (R0 + R1) / R0

     V0 =2.5*(61/10)=15.25V
     V1 =2.5*(61/10)=15.25V
     V23=2.5*(85/10)=21.25V
     Ak = Vx / 1024
-----------------------------------------------------*/
void AdcObj::Init(void)
{
unsigned char i;
    AdcChNum = 0;
    ADCSRA = 0x00;
    ADMUX  = 0;//選擇外部2.50為基準
    ACSR = (1 << ACD);//關閉模擬比較器
    SetAdcChNum(AdcChNum);//設置新通道
    for (i = 0; i < 4; i ++) {
        AdcVal[i] = 0;
        AdcCount[i] = 0;
    }
    AdcSum[1] = 0;
    AdcMax[1] = 0;
    AdcMin[1] = 0x1ff;//9位ADC

    AdcSum[2] = 0;
    AdcMax[2] = 0;
    AdcMin[2] = 0x3ff;//10位ADC

    AdcSum[3] = 0;
    AdcMax[3] = 0;
    AdcMin[3] = 0x3ff;//10位ADC
/*----------------------------------------------------
R0 = 10K, R1 = 51K, Vref = 2.50V, Vk = 10, N = 9, 10
公式:Vx = Vref * (R0 + R1) / R0
    Ak = Vx * / 2 ^ n
    Ak0 = 15250 / 512   (N = 9)
        = 30500 / 1024
    Ak1 = 15250 / 1024
    Ak2 = 21250 / 1024
    Ak3 = 21250 / 1024
-----------------------------------------------------*/

    ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1);//64分頻,啟動AD轉換
}

inline
unsigned char AdcObj::GetAdcChNum(unsigned char ChNum)
{
__root __flash  static const unsigned char AdcChNumTab[4] =
{//ADC通道變換表
    0x09,//0b00001001,//差分測試,*10,ADC1-ADC0
    0x09,//0b00001001,//差分測試,*10,ADC1-ADC0
    0x02,//0b00000010,//單端測試,*1,ADC2
    0x00//0b00000000,//單端測試,*1,ADC0
//    0x03//0b00000011,//電壓,單端測試,*1,ADC3
};
    return AdcChNumTab[ChNum & 0x03];//返回ADC通道變換號
}

inline
void AdcObj::SetAdcChNum(unsigned char ChNum)//設置ADC通道變換號
{
//    ADMUX = (1 << REFS1) | (1 << REFS0) | GetAdcChNum(ChNum);//選擇內部2.56為基準
    ADMUX = (0 << REFS1) | (1 << REFS0) | GetAdcChNum(ChNum);//選擇外部2.50為基準
}

void AdcObj::Exec(void)
{
//volatile
unsigned int AdcResult;
//volatile
unsigned long val;
    AdcResult = ADC & 0x3ff;//取ADC轉換電壓,并保存
    SetAdcChNum(AdcChNum + 1);//設置新通道
    if (AdcChNum > 0)
    {
/*-----------------------------------------------------------
  求累加和
------------------------------------------------------------*/
        AdcSum[AdcChNum] += AdcResult;//存累加和
/*-----------------------------------------------------------
  求最大值
------------------------------------------------------------*/
        if (AdcResult > AdcMax[AdcChNum])
        {
            AdcMax[AdcChNum] = AdcResult;//最大值
        }
/*-----------------------------------------------------------
  求最小值
------------------------------------------------------------*/
        if (AdcResult <= AdcMin[AdcChNum])
        {
            AdcMin[AdcChNum] = AdcResult;//存最小值
        }
        AdcCount[AdcChNum] ++;
        if (AdcCount[AdcChNum] >= 18)//每點測試18次,濾波
        {
/*-----------------------------------------------------------
  求平均值
------------------------------------------------------------*/
/*----------------------------------------------------
     V0 =2.5*(61/10)=15.25V
     V1 =2.5*(61/10)=15.25V
     V23=2.5*(85/10)=21.25V
-----------------------------------------------------*/
            val = AdcSum[AdcChNum] - AdcMax[AdcChNum] - AdcMin[AdcChNum];
            val *= AdcAkVal[AdcChNum];
            val >>= 14;//18中取16后除以1024
            AdcVal[AdcChNum] = val;
/*-----------------------------------------------------------
  初始化
------------------------------------------------------------*/
            AdcSum[AdcChNum] = 0;
            AdcMax[AdcChNum] = 0;
            if (AdcChNum == 1)
            {
                AdcMin[AdcChNum] = 0x1ff;//9位ADC
            }
            else
            {
                AdcMin[AdcChNum] = 0x3ff;//10位ADC
            }
            AdcCount[AdcChNum] = 0;
    }
    AdcChNum ++;//準備下個通道
    AdcChNum &= 3;
    ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1);//64分頻
}
22
 樓主| 發表于 2009-4-2 23:42:15 | 只看該作者
本帖最后由 hotpower 于 2009-4-2 23:44 編輯

注意樓上的"跳水"濾波算法
hotpower 發表于 2007-8-23 02:51 AVR 單片機 ←返回版面   舉報該貼


hotpower 發表于 2007-8-13 21:07 PIC 單片機 ←返回版面

8樓: 這種算法的優點是點數無限~~~(附"跳水算法")

當然N>=3.而且最好N>3為好.在N很大時就見其優點了.
例如: 3中取1,4中取2,5中取3...10中取8...252中取"二百五"~~~
全部只用這4個寄存器~~~,當然要考慮累加越界類型選擇的問題.
注意: N最好取4, 6, 10, 34, 66, 130等等~~~!!!!!!!!!!!!!!


/*-----------------------------------------------------------
取ADC轉換電壓
------------------------------------------------------------*/
AdcResult = ADC & 0x3ff;//取ADC轉換電壓結果
/*-----------------------------------------------------------
  求累加和
------------------------------------------------------------*/
AdcSum += AdcResult;//存累加和
/*-----------------------------------------------------------
  求最大值
------------------------------------------------------------*/
if (AdcResult > AdcMax)
{
  AdcMax = AdcResult;//最大值
}
/*-----------------------------------------------------------
  求最小值
------------------------------------------------------------*/
if (AdcResult < AdcMin)//注意:千萬不敢寫成else if ()...
{
  AdcMin = AdcResult;//存最小值
}
AdcCount ++;//計數1次
/*-----------------------------------------------------------
  10中取8("跳水評分算法---去掉一個最高分,去掉...最后得分...")
------------------------------------------------------------*/
if (AdcCount >= 10)//每次濾波10點
{
/*-----------------------------------------------------------
  求平均值
------------------------------------------------------------*/
  val = AdcSum - AdcMax - AdcMin;//自然做到了N-2,以下除法變移位
  val *= AdcGain;//乘增益(一定要先乘后除!!!否則精度丟失!!!)
  val >>= 13;//10中取8后除以1024.(直接得到10進制的mV值)
  AdcVal = val;//得到跳水隊員分數~~~
/*-----------------------------------------------------------
  下一輪初始化(也是ADC的初始化,這里原本是調用函數的~~~)
------------------------------------------------------------*/
  AdcSum = 0;//一定清0
  AdcMax = 0;//一定取最小值
  AdcMin = 0x3ff;//10位ADC,一定取最大值
  AdcCount = 0;//重新開始
}

哈哈~~~有時間再灌灌它與排序的不同和優缺點~~~
23
發表于 2009-4-6 21:59:25 | 只看該作者
大叔講課,俺認識聽講,做好學生
24
發表于 2009-6-14 22:35:21 | 只看該作者
好!hotpower玩C++就是牛!
25
發表于 2009-6-18 12:37:48 | 只看該作者
26
發表于 2009-6-18 12:45:10 | 只看該作者
老HOT實在是強 啊~~
27
發表于 2010-9-26 23:46:53 | 只看該作者
學習了
28
發表于 2011-2-14 15:51:56 | 只看該作者
不錯
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看免费视频黄 | 免费国产在线观看不卡 | 日韩毛片免费视频一级特黄 | 日本不卡二 | 久久亚洲高清观看 | 天堂资源 | 国产日韩精品欧美一区色 | 久久91亚洲精品中文字幕 | 在线精品国产三级 | 久久只这里是精品66 | 99精品国产自产在线观看 | 免费理论片高清西瓜影院 | 无人视频在线观看完整版免费下载 | 久久99精品久久久久久牛牛影视 | 三级视频在线播放线观看 | 国产精品亚洲综合一区在线观看 | 国产网站在线播放 | 三级网站在线免费观看 | 欧美精品一区二区久久 | 亚洲国产欧美久久香综合 | 欧美激情亚洲激情 | 日韩免费视频一区 | 欧美一区二区三区免费观看视频 | 亚洲网站在线播放 | 天天操夜夜拍 | 免费一级毛片能看的 | 国产三级在线观看视频不卡 | 欧美综合自拍亚洲综合图片区 | 善良的妻子在线 | 欧美一区二区三区性 | 国产一区二区三区高清 | 国产aa大片 | 国产一级免费片 | 精品成人在线观看 | 香蕉视频破解版 | 一级做a爱片特黄在线观看免费看 | 久久er99热这里只是精品 | 亚洲人成绝费网站色ww | 国产精品亚洲一区二区麻豆 | 狠狠天天 | 国产91av在线播放 |