|
最近在学习安富莱二代示波器时发现关于采样触发定时器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);
}
以上所说,作者是否觉得正确,期待回复!!!
|
|