STM32实现扫频功能

简介

我们都知道,在信号发生器中,有一个扫频模式:指信号发生器在指定的扫描时间内从起始频率到终止频率变化输出,扫频模式支持线性扫频、对数扫频、和步进扫频三种方式。

起始频率和终止频率

起始频率和终止频率是频率扫描的频率上限和下限。信号发生器总是从起始频率扫频到终止频率,然后又回到起始频率。
 当起始频率< 终止频率,信号发生器从低频向高频扫描。
 当起始频率> 终止频率,信号发生器从高频向低频扫描。
 当起始频率= 终止频率,信号发生器以固定频率输出。

修改“起始频率”或“终止频率”后,信号发生器将重新从指定的“起始频率”开始扫频输出。

扫频类型

扫频类型分为线性、对数、步进三种扫频类型。默认为线性扫频。

线性扫频

在线性扫频模式下,输出信号的频率以线性的方式变化,即每秒若干赫兹的方式改变输出频率,该变化由起始频率、终止频率和扫描时间控制。
在这里插入图片描述

对数扫频

在对数扫频方式下,仪器输出信号的频率以对数方式变化,即每秒倍频程或每秒十倍的方式改变输出频率,该变化由起始频率、终止频率、和扫描时间控制。

启用对数扫频时,用户可以设置以下几个参数:起始频率Fstart,终止频率Fstop和扫描时间 Tsweep。对数扫频的函数原型为:
在这里插入图片描述
Fcuurent 为当前输出的瞬时频率,参数P和T可用以上参数表示如下,
在这里插入图片描述
其中,t 为扫频开始所经历的时间,范围在 0 到 Tsweep之间。

在这里插入图片描述

步进扫频

在步进扫频方式下,仪器输出信号的频率从“起始频率”到“终止频率”之间以阶梯式“步进”,输出信号在每个频点上停留的时间长短由“扫描时间”和“步进数”控制。

在下图中,我们可以看到一条阶梯波,表明输出频率以阶梯式“步进”变化。
在这里插入图片描述

扫描时间

扫描时间默认为1S。范围可以设置1ms 到 500S。修改扫描时间后,信号发生器将重新从指定的“起始频率”开始扫频输出。

这个扫瞄时间与信号本身的频率并不冲突,如起始频率设置为10HZ(100ms),终止频率设置为1KHZ。扫描时间设置100ms。这个时候扫频时间影响的是各个频率点驻留的时间,如果扫瞄时间设置较大,频率变化就较小,如果扫描时间设置较小,频率变化就较大。

算法:

线性扫频

// 假设 扫频率 为: sampleRate 即为总时间内,频率需要变化多少次。

//扫频时间
this->totaltime = this->timeValue; // 时间以秒为单位,直接使用
//需要输出频率变化总数
this->totalsamples = (int) (this->totaltime * this->sampleRate); // 样品总数

//获得差值
double diff = endFreq - startFreq;
//输出频率
double omega;
//每个频率点的频率值
for(double i=0;i <= totalsamples;i++)
{
    t = (i / (double) this->totalsamples) * this->totaltime; // 现在的时间
    omega = startFreq + (diff * t / this->totaltime); 
}

简化后,即为:
omega = startFreq + (diff * i / this->totalsamples);

定时1ms中断服务函数中实现:

 //TIMER3中断  1ms一次
void OS_TASK_IRQHandler(void)
{
    static uint8_t s_state = 0;

    static uint32_t s_outFrequency = 0;
	
	static uint32_t s_timeCnt = 0;
	
    //差值频率
    double diff = tMasterBoardData.Flash_StopFreq - tMasterBoardData.Flash_StartFreq;


	// u8 i = 0;
	if (RESET != TIM_GetITStatus(OS_TASK_TIM,TIM_IT_Update))//检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(OS_TASK_TIM,TIM_IT_Update);
			
		/* 全局运行时间每1ms增1 */
		g_iRunTime++;
		if (g_iRunTime == 0x7FFFFFFF)	/* 这个变量是 int32_t 类型,最大数为 0x7FFFFFFF */
		{
			g_iRunTime = 0;
		}
		
        switch (s_state)
        {
        /* 递增环节 */
        case 0:
            //频率改变,占空比不变
            if(tMasterBoardData.Flash_SweepMode & (1<<0))
            {
                if(tMasterBoardData.Flash_RiseTime > g_iRunTime)
                {
                    s_outFrequency = tMasterBoardData.Flash_StartFreq + diff * g_iRunTime / tMasterBoardData.Flash_RiseTime;
                    tMasterBoardData.ActualFrequenct = s_outFrequency;      
					Set_TIM_PWM_Update(TIM1,4,tMasterBoardData.ActualFrequenct,tMasterBoardData.Flash_StartDuty*100);
                }   
                else
                {
                    g_iRunTime = 0;
                    s_state = 1;
                }                    
            }   
            break;

        /* 保持环节 */
        case 1:
            if(tMasterBoardData.Flash_SweepMode & (1<<0))
            {
                if(tMasterBoardData.Flash_HodeTime > g_iRunTime)
                {
                    s_outFrequency = tMasterBoardData.Flash_StopFreq;
                    tMasterBoardData.ActualFrequenct = s_outFrequency;      
					Set_TIM_PWM_Update(TIM1,4,tMasterBoardData.ActualFrequenct,tMasterBoardData.Flash_StartDuty*100);
                }   
                else
                {
                    g_iRunTime = 0;
                    s_state = 2;
                }                    
            } 
            break;
        
        /* 递减环节 */
        case 2:
            if(tMasterBoardData.Flash_SweepMode & (1<<0))
            {
                if(tMasterBoardData.Flash_FallTime > g_iRunTime)
                {
                    s_outFrequency = tMasterBoardData.Flash_StopFreq - diff * g_iRunTime / tMasterBoardData.Flash_FallTime;
                    tMasterBoardData.ActualFrequenct = s_outFrequency;					
					Set_TIM_PWM_Update(TIM1,4,tMasterBoardData.ActualFrequenct,tMasterBoardData.Flash_StartDuty*100);
                }   
                else
                {
                    g_iRunTime = 0;
                    s_state = 0;
                }                    
            } 
            break;
        default:
            break;
        }
     
	}
}
  • 21
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值