标题: 求教 AVR16单片机控制DAC0832频率怎么能达到0-20KHZ [打印本页]

作者: bbxyliyang    时间: 2024-12-5 17:41
标题: 求教 AVR16单片机控制DAC0832频率怎么能达到0-20KHZ
//定时器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;
}


//定时中断服务程序
#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;

}


作者: 飞云居士    时间: 2024-12-9 10:59
实现 0 - 20KHz 频率控制的改进思路
变量HzNeed的调整:
要实现 0 - 20KHz 的频率控制,需要在程序的某个地方(可能是主函数或者通过外部接口)能够动态地改变HzNeed的值。例如,可以通过一个函数来接收期望的频率值,然后重新计算time和设置定时器 1 的计数值。
数据缓冲区DataPtr的更新(如果和波形有关):
根据不同的频率要求,可能需要调整数据缓冲区DataPtr中的数据。例如,如果是生成正弦波,不同频率下正弦波的数据点间隔和周期会不同。可以根据频率计算出合适的数据点,并存入DataPtr指向的缓冲区。
考虑定时器精度和范围限制:
定时器的计数范围和预分频等设置会限制能够实现的最小和最大频率。在这个例子中,已经设置了 8 分频,需要检查这种设置是否能够满足 0 - 20KHz 的频率范围要求。如果不能,可以考虑调整预分频系数或者定时器的工作模式。
同时,要注意定时器计数的精度,例如,在计算time和设置TCNT1时,要确保计数值的准确性,避免频率误差过大。
具体修改示例(假设HzNeed可以从外部改变)
假设在主函数中有一个变量desiredHz表示期望的频率,并且可以在运行过程中改变。
修改InitTime函数:
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;
}
在主函数中(或者其他合适的地方),可以根据需要调用InitTime函数来改变频率:
c
int main()
{
    // 其他初始化代码...
    float desiredHz = 10000; // 初始频率为10KHz
    InitTime(desiredHz);
    // 主循环等其他代码
    while(1)
    {
        // 假设通过某种方式(例如按键中断等)改变desiredHz的值
        if (frequency_changed)
        {
            InitTime(desiredHz);
        }
    }
    return 0;
}
这样,当desiredHz的值改变时,通过重新调用InitTime函数,可以调整定时器的设置,从而改变输出信号的频率。不过这只是一个简单的示例,实际应用中还需要考虑更多的因素,如频率切换的稳定性、波形的质量等。

作者: bbxyliyang    时间: 2024-12-9 15:44
飞云居士 发表于 2024-12-9 10:59
实现 0 - 20KHz 频率控制的改进思路
变量HzNeed的调整:
要实现 0 - 20KHz 的频率控制,需要在程序的某个 ...

您好,我帮晶振换成8MHZ,不分频,频率也只能达到400HZ,再大就不行了,不知道为啥
作者: 飞云居士    时间: 2024-12-9 16:08
bbxyliyang 发表于 2024-12-9 15:44
您好,我帮晶振换成8MHZ,不分频,频率也只能达到400HZ,再大就不行了,不知道为啥

定时器计数原理与频率限制因素分析
当晶振为 8MHz 时,AVR 单片机的定时器时钟频率等于晶振频率(不分频的情况下),即定时器的时钟频率为 8MHz。对于 16 位定时器(如代码中的定时器 1),其最大计数值是。
定时器的溢出周期(也就是中断周期)的计算公式为:,其中是定时器的时钟频率。在晶振为 8MHz 且不分频的情况下,,则。
这意味着在这种设置下,定时器最快的溢出频率(也就是中断频率)约为。如果在中断服务程序中更新输出信号(比如通过DAC0832输出波形),那么输出信号的频率就会受到这个中断频率的限制。
在你提供的代码中,还有一个变量36参与了频率计算(time=(1000000)/(HzNeed*36);),这个36可能与每个周期内的点数或者其他相关因素有关。假设它是每个周期的点数,那么实际能够达到的最高频率还会进一步降低,因为每个周期需要足够的点数来完整地表示波形。
作者: bbxyliyang    时间: 2024-12-15 09:59
飞云居士 发表于 2024-12-9 16:08
定时器计数原理与频率限制因素分析
当晶振为 8MHz 时,AVR 单片机的定时器时钟频率等于晶振频率(不分频 ...

我换了12MHZ,可以达到1KHZ,但是还是很难达到20KHZ




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1