久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3550|回復: 10
打印 上一主題 下一主題
收起左側

通過單片機ADC讀取電位器的值改變定時器程序調試

[復制鏈接]
跳轉到指定樓層
樓主
ID:254747 發表于 2021-9-5 20:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
其中MAN_KUAN_PIN_LV這個數據是來自ADC的   我將ADC程序放在了后面

這個程序是這樣的 通過ADC讀取電位器的值然后發送到這里來改變 定時器計時長度的,現在的問題是 程序運行起來只要不動電位器也就是不傳入新的數據 LED就閃爍正常   當我旋轉電位器   就出現LED長亮或者熄滅 過一段時間就恢復正常,
1.慢慢旋轉要好點 但是還是會出現問題
2.快速旋轉就馬上出現問題  這樣肯定是不行的  我要的結果就是隨便旋轉輸出都要正常
3.這個問題是怎么導致的  是電位器數據丟失嗎 但是用數碼管測試又沒有發現丟失數據都正常
4.是不是ADC傳出來的數據不對導致的  
5.是不是我在改變這個值的時候需要關閉定時器   我關閉了  不行 還是一樣的  
6.我將ADC函數(FU_PIN_JIE_GUO_GetADCResult())直接傳入到了void    MAN_KUAN_ADJ(unsigned char MAN_KUAN_PIN_LV )這個函數里面

由于我的程序全部都是模塊編程的  全部貼上來更亂  我把關鍵的東西貼了上來 還請大神給我看看  謝謝  我非常著急

void Timer1_Init(void)                //1毫秒@18.432MHz
{
                 EA = 1;//打開總中斷
                 AUXR |= 0x40;                //定時器時鐘1T模式
                 TMOD &= 0x0F;                //設置定時器模式
                 TL1 = 0x40;                  //設置定時初值
                 TH1 = 0xA2;                  //設置定時初值
                 TF1 = 0;                    //清除TF1標志
                 TR1 = 1;                    //定時器1開始計時            
                 ET1 = 1;                        // 啟動定時器1中斷允許位

}



/*-------------------------------------
功能:定時器1 中斷服務程序
介紹:中斷程序無需聲明
--------------------------------------*/

void timer1_isr(void) interrupt 3
{

          MAN_KUAN_SHI_JIAN++;

}



void    MAN_KUAN_ADJ(unsigned char MAN_KUAN_PIN_LV )
        
{   
        
          unsigned char   TEMP_MAI_KUAN;


    TEMP_MAI_KUAN =(unsigned char) 0X3E8 / MAN_KUAN_PIN_LV*2;

                if(TEMP_MAI_KUAN == MAN_KUAN_SHI_JIAN)        
                                {
                                                        MAN_KUAN_SHI_JIAN = 0;
                                                        LED1 = ~LED1;         
                                }                        
         

}
下面是ADC程序

//準換速率是180個時鐘
void ADC_INIT ()
        
{
      P1ASF |= 0X3C;                       //  將P1.2 P1.3 P1.4 P1.5口作為ADC輸入信號
            ADC_RES=0;                           //清零轉換結果寄存器高8位
            ADC_RESL=0;                          //清零轉換結果寄存器低2位
      ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START ;  //打開電源 設置速度位180個時鐘 開始轉換
      Delay1ms();
            Delay1ms();                          //延時 等待電源穩定            
            Delay1ms();
            Delay1ms();
            Delay1ms();                          //延時 等待電源穩定            
            Delay1ms();
}



FU_PIN_JIE_GUO_GetADCResult()
{
        
            unsigned  int  fupingjieguo;
                        ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch2 | ADC_START;  //打開電源 速度180個時鐘 選擇通道2 啟動轉換
                        _nop_();                             //等待4個NOP
                        _nop_();
                        _nop_();
                        _nop_();
                        while (!(ADC_CONTR & ADC_FLAG));     //等待ADC轉換完成  全部為1 表示轉換完成
//             ADC_CONTR &= ~0X80;                  //關閉ADC電源  節約功耗
                        ADC_CONTR &= ~ADC_FLAG;              //Close ADC  清楚標識位
                        fupingjieguo = (ADC_RES<<2) + ADC_RESL;    //將高2兩位  和低8位的結果相加得到10位的結果

            fupingjieguo = fupingjieguo/40.92;   //ad輸出的結果最大是1024按照,但是只要0-25
                                                 //縮小倍率就是1023除以25就是40.92 故用1023除以40.92即可轉換為25

            return fupingjieguo;                 //返回ADC結果
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:624769 發表于 2021-9-5 21:35 | 只看該作者
(unsigned char) 0X3E8
你這里強制 unsigned char 之后  后面全是單字節運算。即 0x3E8 直接變 0xE8 后面除法也一樣。
建議不要這個 unsigned char
回復

使用道具 舉報

板凳
ID:161164 發表于 2021-9-5 21:42 | 只看該作者
如果問題真的出現在你以為有問題的地方
你已經可以自己解決問題而不是上來問問題
所以還是乖乖的把所有代碼貼上來吧
回復

使用道具 舉報

地板
ID:960726 發表于 2021-9-5 22:51 | 只看該作者
1、TEMP_MAI_KUAN =(unsigned char) 0X3E8 / MAN_KUAN_PIN_LV*2;可讀性不好!
直接,TEMP_MAI_KUAN =2000/MAN_KUAN_PIN_LV的意思?
2、會不會是ADC沒有做濾波處理;
3、 另外,這里的判斷, if(TEMP_MAI_KUAN == MAN_KUAN_SHI_JIAN)必須在1mS內執行到,建議改成<=呢?
回復

使用道具 舉報

5#
ID:254747 發表于 2021-9-6 09:25 | 只看該作者
188610329 發表于 2021-9-5 21:35
(unsigned char) 0X3E8
你這里強制 unsigned char 之后  后面全是單字節運算。即 0x3E8 直接變 0xE8 后面 ...

這是我找不到辦法了后面添加的   現在已經去掉了 謝謝哦
回復

使用道具 舉報

6#
ID:254747 發表于 2021-9-6 09:26 | 只看該作者
本帖最后由 不將就123 于 2021-9-6 09:44 編輯
seuww 發表于 2021-9-5 22:51
1、TEMP_MAI_KUAN =(unsigned char) 0X3E8 / MAN_KUAN_PIN_LV*2;可讀性不好!
直接,TEMP_MAI_KUAN =2000/ ...

ADC里面沒有濾波函數   嗯嗯  感謝  今天我回去在改進一下  但是這里只能等于 不小小于或者大于
回復

使用道具 舉報

7#
ID:139866 發表于 2021-9-6 10:24 | 只看該作者
乖乖貼代碼吧,水平不夠這點代碼看不出哪里有BUG
回復

使用道具 舉報

8#
ID:254747 發表于 2021-9-6 13:52 | 只看該作者
天ノ憶 發表于 2021-9-6 10:24
乖乖貼代碼吧,水平不夠這點代碼看不出哪里有BUG

好的   我今天回去吧代碼整理了  全部貼上來  給大家看看   尋求一下問題  
回復

使用道具 舉報

9#
ID:624769 發表于 2021-9-6 14:08 | 只看該作者
unsigned  int  fupingjieguo;
fupingjieguo = (ADC_RES<<2) + ADC_RESL;    //將高2兩位  和低8位的結果相加得到10位的結果
fupingjieguo = fupingjieguo/40.92;   //ad輸出的結果最大是1024按照,但是只要0-25
                                                 //縮小倍率就是1023除以25就是40.92 故用1023除以40.92即可轉換為25
你這個 fupingjieguo 是整形,
你下面卻讓他參與 浮點 計算. 得到的結果可能還沒有 除以 41 來的準確。
你既然只要 0- 25 你ADC 只要取 高 8 位 就可以了,本來低二位就是誤差位你不用就好了,你非把它拉進來,為了增加結果的抖動范圍么??
回復

使用道具 舉報

10#
ID:254747 發表于 2021-9-7 09:33 | 只看該作者
188610329 發表于 2021-9-6 14:08
unsigned  int  fupingjieguo;
fupingjieguo = (ADC_RES

謝謝大師指導,通過這兩天不斷找問題 ,你說的這個現象很有可能  ,我今天下班測試一下 , 目前看到的問題  可能就是ADC在傳數據到中斷函數的時候出問題了 ,   程序下載進去以后, 通電測試, 當快速旋轉電位器就會導致中斷無法正常工作 LED長亮或者熄滅 , 同時高概率出現上電就 進入中斷函數, 然后哪個LED燈一直亮, 就好像是定時器沒有定時一樣, 或許和你說的有關, 可能就是ADC電位器的值在上電的時間丟失了導致定時器不知道,定時多久,出現了LED長亮的現象。
回復

使用道具 舉報

11#
ID:213173 發表于 2021-9-7 10:44 | 只看該作者
本帖最后由 wulin 于 2021-9-7 10:49 編輯

不知樓主用ADC控制定時器的周期在多長時間范圍。按一般思路,定時器用8位自動重載模式,ADC取8位精度,直接用ADC_RES結果賦值TH1,如果要縮小ADC取值范圍可以在電位器串聯合適的分壓電阻即可。樓主把非常簡單的事情搞得這么復雜,根本用不著浮點去算這么簡單的數據。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品一区二区www | 一区二区三区视频 | 国产成人精品一区二区三区视频 | 欧美黄色小视频 | 亚洲国产一区在线 | 伊人中文字幕 | 久久久久久国产精品免费免费狐狸 | 国产欧美精品一区二区 | 国产99视频精品免费视频7 | 欧美日韩国产一区二区三区 | 一区二区三区视频在线 | 亚洲 自拍 另类 欧美 丝袜 | 久久久精品综合 | 中文字幕啪啪 | 日韩1区2区 | 亚洲网站在线观看 | 韩日一区 | 久久精品国产精品青草 | 亚洲欧洲av在线 | 久久精品一区二区三区四区 | 国产 亚洲 网红 主播 | 青青草在线视频免费观看 | 日韩成人免费 | www亚洲免费国内精品 | 视频1区2区| 日韩免费在线观看视频 | 狠狠婷婷综合久久久久久妖精 | 亚洲高清视频在线观看 | 国产午夜精品理论片a大结局 | 欧美a在线看 | 欧美成人a∨高清免费观看 欧美日韩中 | www国产成人免费观看视频,深夜成人网 | 久久久91精品国产一区二区三区 | 欧美成视频在线观看 | 一区二区亚洲 | 日韩精品激情 | 日韩精品一区在线观看 | www国产亚洲精品久久网站 | 午夜色婷婷 | 成人久久久久久久久 | av激情在线 |