硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1927|回复: 8
收起左侧

关于安富莱二次示波器采样率调整存在的疑问?

[复制链接]

4

主题

50

回帖

62

积分

初级会员

积分
62
发表于 2018-6-20 09:08:59 | 显示全部楼层 |阅读模式
最近在学习安富莱二代示波器时发现关于采样触发定时器1的周期和分频数组时后面几组算出来的采样率是不对的,如下:
/* μ¥í¨μà2éÑùÂ꣬2.8Mspsμ½1sps****************************************************************************/
const uint32_t g_SampleFreqTable[][2] =
{
        {2800000,  1},     //2.8Msps
        {2000000,  1},     //2Msps
        {1000000,  1},     //1Msps
        {500000,   1},     //500Ksps
        {200000,   1},     //200Ksps
       
        {100000,   1},     //100Ksps
        {50000,    1},     //50Ksps
        {20000,    1},     //20Ksps
        {10000,    1},     //10Ksps
        {5000,     1},     //5Ksps
       
        {16800,      5},    //2Ksps    -------------------------从这里开始,定时周期和分频代入可能存在错误????
        {16800,     10},    //1Ksps
        {16800,     20},    //500sps
        {16800,     50},    //200sps
        {16800,     100},   //100sps
       
        {16800,     200},   //50sps
        {16800,     500},   //20sps
        {16800,     1000},  //10sps
        {16800,     2000},  //5sps
        {16800,     5000},  //2sps
        {16800,     10000}, //1sps
};

定时器周期及分频设置源码如下:
static void TIM1_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);       


    TIM_Cmd(TIM1, DISABLE);       
         
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);                                      
    TIM_TimeBaseStructure.TIM_Period =  168000000/g_SampleFreqTable[TimeBaseId][0] - 1;    在这里周期前面已经有168M了,那在除以上面红色数组部分的第一个数就是一个10K计数
    TIM_TimeBaseStructure.TIM_Prescaler = g_SampleFreqTable[TimeBaseId][1]-1;                   在这里分频为 5时那,每个计数脉冲周期为5/168M,这样结合上面的周期数,采样率是否 就不是上面红色部分备注规定的采样率整数值了,比如就按5来说,实际采样率是168M/5/10K=3360,也就是3.36ksps 了
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                       
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;      
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;                  
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                   
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      
    TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/2;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;             
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;          
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;                           
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;          
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;            
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
       

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                   
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     
    TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period-1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;         
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;                  
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;         
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;          
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);
    //TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);                 
    //TIM_ARRPreloadConfig(TIM1, ENABLE);                                             
    TIM_Cmd(TIM1, ENABLE);       
       
    /* ê1ÄüPWMêä3ö */       
    TIM_CtrlPWMOutputs(TIM1, ENABLE);                 
}

以上所说,作者是否觉得正确,期待回复!!!

回复

使用道具 举报

36

主题

2038

回帖

2146

积分

至尊会员

积分
2146
发表于 2018-6-20 11:22:34 | 显示全部楼层
你理解错了,兄弟。

TIM1 更新周期是 = TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1)是这么算的。

Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-6-20 13:57:32 | 显示全部楼层
上面的大哥,可能是我理解错了,但也许你带入算下就知道对不对了。。。。。。
TIM1 更新周期是 = TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1)
我就选择采样率数组中的  {16800,      5},    //2Ksps这一组带入,就按你的这个公式来算下,过程如下:
那么首先g_SampleFreqTable[TimeBaseId][0]=16800;
1.首先确定”(TIM_Period + 1)“,按程序初始化中的: TIM_TimeBaseStructure.TIM_Period =  168000000/g_SampleFreqTable[TimeBaseId][0] - 1; 这一句可知(TIM_Period + 1)=(168000000/g_SampleFreqTable[TimeBaseId][0] - 1)+1=168000000/g_SampleFreqTable[TimeBaseId][0]=168000000/16800=10000;
2.再确定“(TIM_Prescaler + 1)”,按程序初始化中的:TIM_TimeBaseStructure.TIM_Prescaler = g_SampleFreqTable[TimeBaseId][1]-1;这一句知
(TIM_Prescaler + 1)= g_SampleFreqTable[TimeBaseId][1]-1+1=5-1+1=5;
3.最后分别带入得出TIM1 更新周期是 = TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1)=168000000/10000/5=3360,难道有错吗?
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-6-20 14:11:03 | 显示全部楼层
再追加一下,由于g_SampleFreqTable这个二维数组里面头一个是周期,每二个是分频,但是在初始化中前面已经有一个168000000,原码是TIM_TimeBaseStructure.TIM_Period=168000000/g_SampleFreqTable[TimeBaseId][0] ,所以这样一来,整个周期就是10K的计数,而分频是每二个,168M的主频分成5份,那计数频就绪就是不10的倍数了,采样率和备注的就肯定不相符了,实际也是这样,所以我觉得作者这方面肯定要改一下才对。。。。。。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2018-6-20 14:19:07 | 显示全部楼层
bebj2009 发表于 2018-6-20 13:57
上面的大哥,可能是我理解错了,但也许你带入算下就知道对不对了。。。。。。
TIM1 更新周期是 = TIM1CLK  ...

你基本的乘除法不会算了,钻牛角尖了,老铁

TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1) = 168000000/16800/5
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-6-20 14:22:43 | 显示全部楼层
eric2013 发表于 2018-6-20 14:19
你基本的乘除法不会算了,钻牛角尖了,老铁

TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1) = ...

但是我真的想理解清楚你的初始化中不是明明写的是 TIM_TimeBaseStructure.TIM_Period =  168000000/g_SampleFreqTable[TimeBaseId][0] - 1; 那这样一来计数周期是168000000/16800=10000啊,下第2个才是分频,而分的这个频率是168M,而不是周期的10000啊,难道这样理解不对吗?
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-6-20 14:28:29 | 显示全部楼层
eric2013 发表于 2018-6-20 14:19
你基本的乘除法不会算了,钻牛角尖了,老铁

TIM1CLK / (TIM_Period + 1)/(TIM_Prescaler + 1) = ...

我们理清楚一点是TIM_Period实际参与运算的是不16800,而是你的源码写的TIM_TimeBaseStructure.TIM_Period =  168000000/g_SampleFreqTable[TimeBaseId][0] - 1------------------------------------》》》》那么168000000/16800=10000才是TIM_Period,所以我敢肯定这一点是你理解错了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
发表于 2018-6-20 14:32:01 | 显示全部楼层
bebj2009 发表于 2018-6-20 14:22
但是我真的想理解清楚你的初始化中不是明明写的是 TIM_TimeBaseStructure.TIM_Period =  168000000/g_Sam ...

我算反了,谢谢指出
16800全部换成10000就好了。
回复

使用道具 举报

4

主题

50

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2018-6-20 14:42:19 | 显示全部楼层
eric2013 发表于 2018-6-20 14:32
我算反了,谢谢指出
16800全部换成10000就好了。

好的,差点我都放弃坚持了,我以为我的理解错了,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 17:30 , Processed in 0.183000 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表