找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 1048|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

求教 AVR16單片機(jī)控制DAC0832頻率怎么能達(dá)到0-20KHZ

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:190577 發(fā)表于 2024-12-5 17:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//定時(shí)器1的初始化,CTC模式,8分頻
void InitTime(void)
{
  SEI();
  TIMSK|=(1<<TOIE1);//允許T1 中斷
   TCCR1A = 0x00;
  TCCR1B=0x02;//8 分頻
   time=(1000000)/( HzNeed*36);        //1000000 是1秒       
TCNT1H=(65536-time+200)/256;
  TCNT1L=(65536-time+200)%256;
}


//定時(shí)中斷服務(wù)程序
#pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
void timer1_ovf_isr(void)
{
static unsigned char i=0;
TCNT1H=(65536-time+200)/256;
  TCNT1L=(65536-time+200)%256;

if(StartEn==0xff)
{

LED_ON;}
else
LED_OFF;

PORTC = *(DataPtr+i);
i++;

if(i > 35)
i = 0;

}

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

使用道具 舉報(bào)

沙發(fā)
ID:404160 發(fā)表于 2024-12-9 10:59 | 只看該作者
實(shí)現(xiàn) 0 - 20KHz 頻率控制的改進(jìn)思路
變量HzNeed的調(diào)整:
要實(shí)現(xiàn) 0 - 20KHz 的頻率控制,需要在程序的某個(gè)地方(可能是主函數(shù)或者通過外部接口)能夠動(dòng)態(tài)地改變HzNeed的值。例如,可以通過一個(gè)函數(shù)來接收期望的頻率值,然后重新計(jì)算time和設(shè)置定時(shí)器 1 的計(jì)數(shù)值。
數(shù)據(jù)緩沖區(qū)DataPtr的更新(如果和波形有關(guān)):
根據(jù)不同的頻率要求,可能需要調(diào)整數(shù)據(jù)緩沖區(qū)DataPtr中的數(shù)據(jù)。例如,如果是生成正弦波,不同頻率下正弦波的數(shù)據(jù)點(diǎn)間隔和周期會(huì)不同。可以根據(jù)頻率計(jì)算出合適的數(shù)據(jù)點(diǎn),并存入DataPtr指向的緩沖區(qū)。
考慮定時(shí)器精度和范圍限制:
定時(shí)器的計(jì)數(shù)范圍和預(yù)分頻等設(shè)置會(huì)限制能夠?qū)崿F(xiàn)的最小和最大頻率。在這個(gè)例子中,已經(jīng)設(shè)置了 8 分頻,需要檢查這種設(shè)置是否能夠滿足 0 - 20KHz 的頻率范圍要求。如果不能,可以考慮調(diào)整預(yù)分頻系數(shù)或者定時(shí)器的工作模式。
同時(shí),要注意定時(shí)器計(jì)數(shù)的精度,例如,在計(jì)算time和設(shè)置TCNT1時(shí),要確保計(jì)數(shù)值的準(zhǔn)確性,避免頻率誤差過大。
具體修改示例(假設(shè)HzNeed可以從外部改變)
假設(shè)在主函數(shù)中有一個(gè)變量desiredHz表示期望的頻率,并且可以在運(yùn)行過程中改變。
修改InitTime函數(shù):
c
void InitTime(float desiredHz)
{
    SEI();
    TIMSK|=(1<<TOIE1);//允許T1 中斷
    TCCR1A = 0x00;
    TCCR1B = 0x02;//8 分頻
    time=(1000000)/(desiredHz*36);        //1000000 是1秒
    TCNT1H=(65536 - time+200)/256;
    TCNT1L=(65536 - time+200)%256;
}
在主函數(shù)中(或者其他合適的地方),可以根據(jù)需要調(diào)用InitTime函數(shù)來改變頻率:
c
int main()
{
    // 其他初始化代碼...
    float desiredHz = 10000; // 初始頻率為10KHz
    InitTime(desiredHz);
    // 主循環(huán)等其他代碼
    while(1)
    {
        // 假設(shè)通過某種方式(例如按鍵中斷等)改變desiredHz的值
        if (frequency_changed)
        {
            InitTime(desiredHz);
        }
    }
    return 0;
}
這樣,當(dāng)desiredHz的值改變時(shí),通過重新調(diào)用InitTime函數(shù),可以調(diào)整定時(shí)器的設(shè)置,從而改變輸出信號(hào)的頻率。不過這只是一個(gè)簡單的示例,實(shí)際應(yīng)用中還需要考慮更多的因素,如頻率切換的穩(wěn)定性、波形的質(zhì)量等。
回復(fù)

使用道具 舉報(bào)

板凳
ID:190577 發(fā)表于 2024-12-9 15:44 | 只看該作者
飛云居士 發(fā)表于 2024-12-9 10:59
實(shí)現(xiàn) 0 - 20KHz 頻率控制的改進(jìn)思路
變量HzNeed的調(diào)整:
要實(shí)現(xiàn) 0 - 20KHz 的頻率控制,需要在程序的某個(gè) ...

您好,我?guī)途д駬Q成8MHZ,不分頻,頻率也只能達(dá)到400HZ,再大就不行了,不知道為啥
回復(fù)

使用道具 舉報(bào)

地板
ID:404160 發(fā)表于 2024-12-9 16:08 | 只看該作者
bbxyliyang 發(fā)表于 2024-12-9 15:44
您好,我?guī)途д駬Q成8MHZ,不分頻,頻率也只能達(dá)到400HZ,再大就不行了,不知道為啥

定時(shí)器計(jì)數(shù)原理與頻率限制因素分析
當(dāng)晶振為 8MHz 時(shí),AVR 單片機(jī)的定時(shí)器時(shí)鐘頻率等于晶振頻率(不分頻的情況下),即定時(shí)器的時(shí)鐘頻率為 8MHz。對(duì)于 16 位定時(shí)器(如代碼中的定時(shí)器 1),其最大計(jì)數(shù)值是。
定時(shí)器的溢出周期(也就是中斷周期)的計(jì)算公式為:,其中是定時(shí)器的時(shí)鐘頻率。在晶振為 8MHz 且不分頻的情況下,,則。
這意味著在這種設(shè)置下,定時(shí)器最快的溢出頻率(也就是中斷頻率)約為。如果在中斷服務(wù)程序中更新輸出信號(hào)(比如通過DAC0832輸出波形),那么輸出信號(hào)的頻率就會(huì)受到這個(gè)中斷頻率的限制。
在你提供的代碼中,還有一個(gè)變量36參與了頻率計(jì)算(time=(1000000)/(HzNeed*36);),這個(gè)36可能與每個(gè)周期內(nèi)的點(diǎn)數(shù)或者其他相關(guān)因素有關(guān)。假設(shè)它是每個(gè)周期的點(diǎn)數(shù),那么實(shí)際能夠達(dá)到的最高頻率還會(huì)進(jìn)一步降低,因?yàn)槊總€(gè)周期需要足夠的點(diǎn)數(shù)來完整地表示波形。
回復(fù)

使用道具 舉報(bào)

5#
ID:190577 發(fā)表于 2024-12-15 09:59 | 只看該作者
飛云居士 發(fā)表于 2024-12-9 16:08
定時(shí)器計(jì)數(shù)原理與頻率限制因素分析
當(dāng)晶振為 8MHz 時(shí),AVR 單片機(jī)的定時(shí)器時(shí)鐘頻率等于晶振頻率(不分頻 ...

我換了12MHZ,可以達(dá)到1KHZ,但是還是很難達(dá)到20KHZ
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表