国产毛片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
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩一区高清中文字幕 | 亚欧乱色视频 视频在线 | 岛国成人在线 | 国产精品大全国产精品 | 色婷婷一区二区三区四区成人网 | 日本黄色一级网站 | 在线不卡 | 视频一区二区三区蜜桃麻豆 | 星武神诀在线观看全集免费播放 | 国产精品国三级国产aⅴ | 四虎永久地址4hu2019 | 欧美视频久久久 | 国产激情视频 | 欧美亚洲另类在线 | 欧美激情精品久久久久久大尺度 | 色婷婷在线观看视频 | 69av在线视频 | 9cao视频精品 | 天天干天天草天天 | 日本久久久久久中文字幕 | 5月色婷婷 | 亚洲经典一区 | 男人天堂1024| live韩剧| 日日奇| 很狠操| 一级做a爰片欧美一区 | 日本一本不卡 | 日本va在线观看 | 久久精品国产影库免费看 | 99久久精品免费看国产麻豆 | 国产羞羞的视频在线观看免费 | 在线精品国产成人综合第一页 | 国产高清在线观看视频手机版 | 春日迟迟再出发最新一期在线观看 | 亚洲国产资源 | 色播五月激情五月 | 亚洲国产欧美精品一区二区三区 | 大伊香蕉精品二区视频在线 | 久久精品国产精品亚洲精品 | 免费一级a毛片 |