求助,STM32产生两个stm32 pwm频率可调相同,可调,存在相位差的信号

如何用STM32产生相位差180度,且占空比可调的两路PWM - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 1536|回复: 2
如何用STM32产生相位差180度,且占空比可调的两路PWM
在线时间0 小时
主题帖子好友
新手上路, 积分 8, 距离下一级还需 42 积分
新手上路, 积分 8, 距离下一级还需 42 积分
最近需要用到两路相位差180度,且占空比可调的PWM,看到论坛上说用输出比较模式,但输出比较模式只能产生一定相位差且占空比固定的PWM,求助
在线时间0 小时
主题帖子好友
新手上路, 积分 8, 距离下一级还需 42 积分
新手上路, 积分 8, 距离下一级还需 42 积分
自己顶起来
在线时间6 小时
主题帖子好友
初级会员, 积分 132, 距离下一级还需 68 积分
初级会员, 积分 132, 距离下一级还需 68 积分
使用TIM1的反相输出功能,具体你可以看官方例程,大概代码如下://TIM1做PWM输出
void Tim1_Config(void)
&&TimerPeriod =&&(SystemCoreClock / 20000 ) - 1;
&&ccr1 = TimerPeriod / 2;&&//占空比1/2 = 50%
&&ccr2 = TimerPeriod / 3;&&//占空比1/3 = 33%
&&ccr3 = TimerPeriod / 4;&&//占空比1/4 = 25%
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
&&//时基初始化
&&TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //死区控制用。
&&TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;&&//计数器方向
&&TIM_TimeBaseInitStructure.TIM_Prescaler = 0;& &//Timer clock = sysclock /(TIM_Prescaler+1) = 168M
&&TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
&&TIM_TimeBaseInitStructure.TIM_Period = TimerPeriod - 1;&&
&&TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);&&
&&TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
&&TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E
&&TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_E
&&TIM_OCInitStructure.TIM_Pulse = ccr1;
&&TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H
&&TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_H
&&TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_S
&&TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_R
&&TIM_OC1Init(TIM1,&TIM_OCInitStructure);&&
&&TIM_Cmd(TIM1,ENABLE);
&&TIM_CtrlPWMOutputs(TIM1,ENABLE);
}例如使用OC1/OC1N两个通道输出反向信号如下,是否你要的效果?
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by查看: 4428|回复: 17
mini开发板测量外部两路信号的相位差
主题帖子精华
中级会员, 积分 228, 距离下一级还需 272 积分
在线时间0 小时
论坛搜索了一下关于相位差测量的方法,有几个疑问咨询一下大家,看到大部分人都是说把信号整成方波,通过测量两列方波的时间差算出周期,既然这样,那我是不是需要一个定时器同时捕获两路信号,计算两路信号的时间差啊?
主题帖子精华
金钱113671
在线时间839 小时
既然是2路信号,必定是要2个IO去采集,用同一个定时器,捕获两路信号,是可以的.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 228, 距离下一级还需 272 积分
在线时间0 小时
原子哥,能不能帮我看一下怎么编写求两路方波信号的时间差啊?我看了看定时器捕获的相关知识,也在论坛上搜了一下,在中断里边不知道如何下手编写,或者告诉我思路也行。下边的程序我设置好了两路IO口,PA6和PA7,我想在测量频率的同时也能够测量相位差。
void&Cap_Init(u16&arr,u16&psc)
{
//此部分需手动修改IO口设置
&&&RCC-&APB1ENR|=1&&1;&&&&&&&&&//TIM3&时钟使能
&&&RCC-&APB2ENR|=1&&2;&&&&&&&&&//使能PORTA时钟&&&&&&
&&&GPIOA-&CRL&=0XF0FFFFFF;&&&&&//PA6&清除之前设置&&
&&&GPIOA-&CRL|=0X;&&&&&//PA6&输入&&&
&&&GPIOA-&ODR|=0&&6;&&&&&&&&&&&//PA6&下拉&&&&
GPIOA-&CRL&=0X0FFFFFFF;//PA7
GPIOA-&CRL|=0X;// &nbspA7&输入&
GPIOA-&ODR|=0&&7;//PA7下拉
&&
&&&TIM3-&ARR=&&&&&&&&&&&&&&//设定计数器自动重装值&&自动装置寄存器&65536
&&&TIM3-&gtSC=&&&&&&&&&&&&&&//预分频器&&预分频器&71
&&&TIM3-&CCMR1|=1&&0;&&&&&&&&&&//CC1S=01&&&&&选择输入端&IC1映射到TI1上
&&&TIM3-&CCMR1|=0&&4;&&&&&&&&&//IC1F=0000&配置输入滤波器&不滤波
&&&TIM3-&CCMR1|=0&&2;&&&&&&&&&//IC1PS=00&&&&配置输入分频,不分频
&&&TIM3-&CCER|=0&&1;&&&&&&&&&&&//CC1P=0&&&&&&&上升沿捕获&高电平有效
&&&TIM3-&CCER|=1&&0;&&&&&&&&&&&//CC1E=1&&&&&&允许捕获计数器的值到捕获寄存器中
&&&TIM3-&CCMR1|=1&&8;&&&&&&&&&&//CC2S=01&&&&&选择输入端&IC2映射到TI2上
&&&TIM3-&CCMR1|=0&&12;&&&&&&&&&//IC2F=0000&配置输入滤波器&不滤波
&&&TIM3-&CCMR1|=0&&10;&&&&&&&&&//IC2PS=00&&&&配置输入分频,不分频
&&&TIM3-&CCER|=0&&5;&&&&&&&&&&&//CC2P=0&&&&&&&上升沿捕获&高电平有效
&&&TIM3-&CCER|=1&&4;&&&&&&&&&&&//CC2E=1&&&&&&允许捕获计数器的值到捕获寄存器中
&&&TIM3-&DIER|=1&&1;&&&&&&&&&&&&&&&&//当有高电平出现时产生捕获&产生中断&执行&TIM3_IRQChannel&
&&&TIM3-&DIER|=1&&2;&
&&&TIM3-&DIER|=1&&0;&&&&&&&&&&&&&&&&//允许更新中断&产生中断请求&&&&
&
&&&TIM3-&CR1|=0x01;&&&&&&&&&&&&&&&&&&//使能计数器& &&&
&&&MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2 & //设置中断 定时器3中断
void&TIM3_IRQHandler(void)
{
u32&temp=0;
temp=TIM3-&SR;//状态寄存器值赋值给temp
if((temp&0X02))&&&//计数器值已被捕获(拷贝)至TIM3-CCR1
{
&&&TIM3-&SR=~(1&&1);//清零
&if(CaptureNumber[0]==0)&&//判断捕获数是否为零
&&{
&&&&IC1ReadValue1[0]=TIM3-&CCR1;&//如果捕获数为0,将捕获寄存器的值赋给IC1ReadValue1
CaptureNumber[0]=1;//成功标志捕获了一次
&if(Flag_cap==0)
&&{
&&&&&&TIM3-&CCER|=1&&1;//捕获发生在IC1的下降沿
Flag_cap=1;&//捕获标志=1
&&&&&&}
&if(Flag_cap==1)
&{
&&&&&&&&TIM3-&CCER&=~(1&&1);//捕获发生在IC1的上升沿
Flag_cap=0;&
&&&&&&&}
&&if(CaptureNumber[0]==1)
&&{
&&&&IC1ReadValue2[0]=TIM3-&CCR1;&//如果捕获数为1,将捕获寄存器的值赋给IC1ReadValue2
&if(IC1ReadValue2[0]&IC1ReadValue1[0])
&{
&&&&&&Capture[0]=(IC1ReadValue2[0]-IC1ReadValue1[0]);
&&&&&}
&{
&&&&&&Capture[0]=((0XFFFF-IC1ReadValue1[0])+IC1ReadValue2[0]);
&&&&&}
Getnum[0]=Capture[0];
CaptureNumber[0]=0;
&if(Flag_cap==0)&&//如果没有捕获&则为低电平时间
&{
&&&&&&table[0]=Getnum[0];
TIM3-&CCER=~(1&&1);
&&&&&}
if(Flag_cap==1)&//如果成功捕获&则为高电平时间
{
&&&&&&table[1]=Getnum[0];
TIM3-&CCER|=(1&&1);
&&&&&&}
&&&&}
&&&
&}
&TIM3-&SR=0;&
}
主题帖子精华
金钱113671
在线时间839 小时
测量相位,你只需要能测量出两路信号的上升沿/下降沿的时间差就可以了啊.
结合频率,就可以算出相位差了.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 228, 距离下一级还需 272 积分
在线时间0 小时
ae07372bbbcc23c648258efd39e06c36_60.jpg (0 Bytes, 下载次数: 0)
22:54 上传
原子哥,你帮我看一下我的相位差测量代码吧?我开启了两路IO,TIM3的CH1和CH2,也即PA6和PA7,我在中断里把频率也都测量出来了。问题是这样的,我打算在通道1的第一次捕获发生的时候(假设上图的A点)将TIM3-&CCR1的时赋给IC1ReadValue1[0],在第2通道的第一次捕获发生的时候(假设上图的B点)将TIM3-&CCR2的时赋给IC1ReadValue1[1],求IC1ReadValue1[1]-IC1ReadValue1[0]的值不就是两路信号的时间差吗,然后除以周期,乘以360度就是相位了,我按照这个思想编了一下代码结果不对的,请原子哥指导一下吧。看一下我的思路对不对,好吧?我决心把这个相位差测量出来,然后把代码分享一下,我基础比较差的。
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"&
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"
#include "rtc.h"
#include "wkup.h"
int main(void)
& Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);
//延时初始化
uart_init(72,9600); //串口1初始化 &&
LED_Init();
& Cap_Init(65535,71);
POINT_COLOR=RED;//设置字体为红色&
printf("F:%dHZ\r\n",(u32)1000000/Getnum[0]); //频率1
& & delay_ms(500);
printf("F1:%dHZ\r\n",(u32)1000000/Getnum[1]); //频率2
& & delay_ms(500);
printf("xiangweicha:%d\r\n",(u32)(IC1ReadValue1[1]-IC1ReadValue1[0])/Getnum[0]*360);//相位差
& & delay_ms(500);
#include "timer.h"
#include "led.h"
////////////////////////////////////////////////////////////////////////////////// &
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//通用定时器 驱动代码
//正点原子@ALIENTEK
//技术论坛:
//修改日期:
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
extern u32 speed_run_
u16 &TIM3CH1_CAPTURE_STA=0; //输入捕获状态
u32 TIM3CH1_CAPTURE_VAL; //输入捕获值
u16 CaptureNumber[5];
u16 Getnum[4];
u16 IC1ReadValue1[5],IC1ReadValue2[5];
u32 Capture[5];
u8 Flag_cap1;
u16 table[4];
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
RCC-&APB1ENR|=1&&1;//TIM3时钟使能 & &
& TIM3-&ARR= &//设定计数器自动重装值//刚好1ms & &
TIM3-&gtSC= &//预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3-&DIER|=1&&0; & //允许更新中断
TIM3-&DIER|=1&&6; & //允许触发中断
TIM3-&CR1|=0x01; & &//使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
void Cap_Init(u16 arr,u16 psc)
//此部分需手动修改IO口设置
& &RCC-&APB1ENR|=1&&1; & & & & //TIM3 时钟使能
& &RCC-&APB2ENR|=1&&2; & & & & //使能PORTA时钟 & & &
& &GPIOA-&CRL&=0XF0FFFFFF; & & //PA6 清除之前设置 &
& &GPIOA-&CRL|=0X; & & //PA6 输入 &&
& &GPIOA-&ODR|=0&&6; & & & & & //PA6 下拉 & &
GPIOA-&CRL&=0X0FFFFFFF;//PA7
GPIOA-&CRL|=0X;//
GPIOA-&ODR|=0&&7;//PA7下拉
& &TIM3-&ARR= & & & & & & &//设定计数器自动重装值 &自动装置寄存器 65536
& &TIM3-&gtSC= & & & & & & &//预分频器 &预分频器 71
TIM3-&SR|=1&0;
& &TIM3-&CCMR1|=1&&0; & & & & &//CC1S=01 & & 选择输入端 IC1映射到TI1上
& &TIM3-&CCMR1|=0&&4; & & & & //IC1F=0000 配置输入滤波器 不滤波
& &TIM3-&CCMR1|=0&&2; & & & & //IC1PS=00 & &配置输入分频,不分频
& &TIM3-&CCER|=0&&1; & & & & & //CC1P=0 & & & 上升沿捕获 高电平有效&
& &TIM3-&CCER|=1&&0; & & & & & //CC1E=1 & & &允许捕获计数器的值到捕获寄存器中 捕获使能
& &TIM3-&CCMR1|=1&&8; & & & & &//CC2S=01 & & 选择输入端 IC2映射到TI2上
& &TIM3-&CCMR1|=0&&12; & & & & //IC2F=0000 配置输入滤波器 不滤波
& &TIM3-&CCMR1|=0&&10; & & & & //IC2PS=00 & &配置输入分频,不分频
& &TIM3-&CCER|=0&&5; & & & & & //CC2P=0 & & & 上升沿捕获 高电平有效
& &TIM3-&CCER|=1&&4; & & & & & //CC2E=1 & & &允许捕获计数器的值到捕获寄存器中
TIM3-&DIER&=~(1&&1);
& &TIM3-&DIER|=1&&1; & & & & & & & &//当有高电平出现时产生捕获 产生中断 执行 TIM3_IRQChannel&
TIM3-&DIER&=~(1&&2); &
& &TIM3-&DIER|=1&&2;&
TIM3-&DIER|=1&&0; & & & & & & & &//允许更新中断 产生中断请求 & &
& &TIM3-&CR1|=0x01; & & & & & & & & &//使能计数器
& &MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
//设置中断 定时器3中断
void TIM3_IRQHandler(void)
u32 temp=0;
temp=TIM3-&SR;//状态寄存器值赋值给temp
if((temp&0X02)) & //计数器值已被捕获(拷贝)至TIM3-CCR1
& &TIM3-&SR=~(1&&1);//清零
if(CaptureNumber[0]==0) &//第一次捕获
& & IC1ReadValue1[0]=TIM3-&CCR1; //保留捕获值
CaptureNumber[0]=1;//设置成功捕获了一次
&if(CaptureNumber[0]==1) &//第2次捕获
& & IC1ReadValue2[0]=TIM3-&CCR1; //保留捕获值
if(IC1ReadValue2[0]&IC1ReadValue1[0])
& & & Capture[0]=(IC1ReadValue2[0]-IC1ReadValue1[0]);
& & & Capture[0]=((0XFFFF-IC1ReadValue1[0])+IC1ReadValue2[0]);
Getnum[0]=Capture[0];
CaptureNumber[0]=0;
&/*捕获/比较2*/
if((temp&0X04)) & //计数器值已被捕获(拷贝)至TIM3-CCR2
TIM3-&SR=~(1&&2);//清零
& & &if(CaptureNumber[1]==0) &//第一次捕获
& & &IC1ReadValue1[1]=TIM3-&CCR2; //保留捕获值
CaptureNumber[1]=1;//设置成功捕获了一次
if(CaptureNumber[1]==1) &//第2次捕获
& & &IC1ReadValue2[1]=TIM3-&CCR2; //保留捕获值
if(IC1ReadValue2[1]&IC1ReadValue1[1])
& & & Capture[1]=(IC1ReadValue2[1]-IC1ReadValue1[1]);
& & & Capture[1]=((0XFFFF-IC1ReadValue1[1])+IC1ReadValue2[1]);
Getnum[1]=Capture[1];
CaptureNumber[1]=0;
&TIM3-&SR=0;&
主题帖子精华
金钱113671
在线时间839 小时
回复【5楼】lixulongren:
---------------------------------
你第二次捕获的时候:
&if(CaptureNumber[0]==1)&&//第2次捕获
&{
&&&&IC1ReadValue2[0]=TIM3-&CCR1;&//保留捕获值
怎么还是读取CCR1的值?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 228, 距离下一级还需 272 积分
在线时间0 小时
回复【6楼】正点原子:
---------------------------这个还是通道1,PA6的捕获啊,PA7的捕获在后边呢
主题帖子精华
金钱113671
在线时间839 小时
回复【7楼】lixulongren:
---------------------------------
你不是测时间差么?
怎么要同一个波捕获2次?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 228, 距离下一级还需 272 积分
在线时间0 小时
回复【8楼】正点原子:
---------------------------------
同一个波捕获两次不就得到这个波的周期了吗!程序有两路,第一路是这样的:判断是不是第一次捕获,如果是,则将TIM3-&CCR1的值赋给IC1ReadValue1[0],如果是第二次捕获,则将TIM3-&CCR1的值赋给IC1ReadValue2[0],IC1ReadValue2[0]减去IC1ReadValue1[0]不就得到信号1的周期了;第二路同样是这样的:判断是不是第一次捕获,如果是,则将TIM3-&CCR2的值赋给IC1ReadValue1[1],如果是第二次捕获,则将TIM3-&CCR2的值赋给IC1ReadValue2[1]。按照这样的思路的话,那么第一路信号的第一次值与第二路信号的第一次捕获值之差不就是两路信号的时间差了吗?也即:IC1ReadValue1[1]-IC1ReadValue1[0]
主题帖子精华
金钱113671
在线时间839 小时
回复【9楼】lixulongren:
---------------------------------
这样可以,不过要考虑溢出情况。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
中级会员, 积分 228, 距离下一级还需 272 积分
在线时间0 小时
我就是按照这个思路走的,可就是测量不出来相位差,IC1ReadValue1[1]-IC1ReadValue1[0]的值经常跳动,我除以周期乘以360的话相位差都上千了,这肯定不对啊,原子哥认真帮我看一下吧
主题帖子精华
中级会员, 积分 307, 距离下一级还需 193 积分
在线时间61 小时
测量两路方波的相位差
21:57 上传
点击文件名下载附件
22.38 MB, 下载次数: 11258
主题帖子精华
中级会员, 积分 254, 距离下一级还需 246 积分
在线时间4 小时
回复【11楼】lixulongren:
---------------------------------
楼主搞定没,是什么问题呢?可以共享一下吗?
主题帖子精华
中级会员, 积分 254, 距离下一级还需 246 积分
在线时间4 小时
回复【12楼】yysforever:
---------------------------------
请问大神你这测两路方波相位差的思路是怎样的?
主题帖子精华
中级会员, 积分 340, 距离下一级还需 160 积分
在线时间15 小时
楼主解决了吗,我在做F107的地感线圈测试,要用到两路频率差,
每天都是新开始
主题帖子精华
初级会员, 积分 113, 距离下一级还需 87 积分
在线时间8 小时
回复【12楼】yysforever:
---------------------------------
你的原理是什么,你只是测了两路脉冲宽度啊
主题帖子精华
初级会员, 积分 57, 距离下一级还需 143 积分
在线时间5 小时
我也用一个定时器两个通道试过,进入了一个if不得等一次中断结束了才出来么,就是测下一组的第一个上升沿时已经过去1个周期多了,我觉得这个计数值的变化比较难弄,还在摸索中,楼主你弄出来了么?
STM32与MSP430交互斗争中……
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
是两路信号输入的问题,用两台函数信号发生器输出的信号测的话是不行的,你用单片机输出两路频率相同的方波是可以测出来的
Powered bystm32 产生3路PWM,每路占空比相同,相位差120度, - 【stm32/stm8】 - 电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 3197|回复: 5
stm32 产生3路PWM,每路占空比相同,相位差120度,
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
控制直流无刷电机,能有一个定时器完成吗?球大神指教
&&&&&&&&&&
在线时间2172 小时
威望13845分
芯币23811枚
TA的帖子TA的资源
应该是可以的,一般来说一个定时器可以实现统一频率,不同的占空比。
在线时间749 小时
威望7599分
芯币6524枚
E金币269枚
TA的帖子TA的资源
一个应该不行吧,至少得两个,上官网找找资料,这方面资料很多的。
在线时间1414 小时
威望6292分
芯币21593枚
E金币300枚
TA的帖子TA的资源
把一个周期分解成三份,定时器定在一份上,三路中央对齐的pwm轮流输出.
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
用高级定时器,通道5(6)常用的模式作为第一相,通道1(2)和3(4)用Asymmetric模式分别做120和240度移相
这个不行的&
在线时间1414 小时
威望6292分
芯币21593枚
E金币300枚
TA的帖子TA的资源
用高级定时器,通道5(6)常用的模式作为第一相,通道1(2)和3(4)用Asymmetric模式分别做120和240度移相
这个不行的
EEWORLD 官方微信
EE福利 唾手可得
Powered by查看: 7304|回复: 7
利用STM32定时器输出2路PWM方波 怎么解决相位差的问题
主题帖子精华
初级会员, 积分 55, 距离下一级还需 145 积分
在线时间0 小时
RT。。。要求相位差在0-359.9之间可调 并且分辨率不大于0.1度
呵呵,请回复
主题帖子精华
金钱113671
在线时间839 小时
不大于0.1度....
可以用3个定时器,来实现你的要求.
具体:定时器A,B作为两路PWM的输出,他们的时钟由定时器C提供.这样你设置好A,B的初始值,然后再开启C作为他们的时钟,达到A,B在C的控制下同步工作,但相位可以设置.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 55, 距离下一级还需 145 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
原子哥,&我们老师推荐的方法用所谓的&&“码表”&&来解决问题。但是码表是什么&老师没有明说。。&不知道&原子哥&能指点一下不
主题帖子精华
金钱113671
在线时间839 小时
我也没用过.不知道所谓的码表是什么方法,呵呵.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 55, 距离下一级还需 145 积分
在线时间0 小时
回复【4楼】正点原子:
---------------------------------
e&..谢谢了啊。
主题帖子精华
初级会员, 积分 196, 距离下一级还需 4 积分
在线时间4 小时
回复【2楼】正点原子:
---------------------------------
定时器计数器的值可以自己写入吗??
主题帖子精华
金钱113671
在线时间839 小时
主题帖子精华
新手上路, 积分 10, 距离下一级还需 40 积分
在线时间5 小时
你好,请问这个问题你解决了吗?
Powered by第33卷第3期2010年6月;电子器件;ChineseJournalofElectron;Vol.33No.3Jun.2010;TheAll2PhaseFFTPhaseDiff;QIULiangfeng,LIUJingbiao;(SchoolofElectronics&Abstract:Fortheneedofsig;andtheARMcompany
第33卷第3期2010年6月
ChineseJournalofElectronDevices
Vol.33 No.3Jun.2010
TheAll2PhaseFFTPhaseDifferenceMeasurementSystemBasedonSTM32
QIULiangfeng,LIUJingbiao,YUHaibin
(SchoolofElectronics&Information,HangzhouDianziUniversity,Hangzhou310018,China)
Abstract:Fortheneedofsignalphasedifferencemeasurementinmilitaryandcivilengineeringfields,basedonAll2phasemeasurementtheory(akindofFFT).
andtheARMcompany’shigh2performanceprocessor,32Bit
CortexM32coreSTM32F103,wedesignedandbuiltalow2cost,simplestructure,fastprandeffectivephasedifferencemeasurementsystem.Afterbysampling127pointandoftheFFTandachievethesignalphasemeasurement.Thetestsshowthatthesystemanof1degree.Keywords:phasedSTM32;AEEACC:7310H
FFT相位差测量系统
邱良丰,刘敬彪,于海滨
(杭州电子科技大学电子信息学院,杭州310018)
摘 要:针对军用和民用工程领域信号相位差测量的需要,基于全相位测量理论,使用ARM公司的高性能32BitCortexM32
内核处理器STM32F103,设计并制作了一个低成本,结构简单,处理速度快而有效的相位差测量系统,通过采样了127个点,处理后做64个点的FFT,实现了信号相位差的测量。测试结果表明有效分辨精度为1度。
M32;全相位FFT;仿真测试关键词:相位测量;ST中图分类号:TP23  文献标识码:A  文章编号:10)03-0357-05
  在各种军用和民用工程领域,存在大量的测量信号相位问题。例如在激光测距中,只有精确测出发出和返回的激光调制波的相位值才可实现精确测距;在GPS导航中,只有测出载波相位值,才可实现精确目标定位等。
由此可见测量2个相同频率的正弦波之间的相位差在工程上具有重要的意义。其测量方法可分为数字测量及模拟测量2种方法。模拟测量的方法有二极管鉴相法,脉冲计数法,功率因数测量法,但这需要专门的硬件电路,测量系统复杂,硬件成本高。而采用数字方法测量,需要的硬件成本低,适用强,对不同的测量对象只需改变可编程器件的内部程序算法即可,且其精度一般高于模拟式测量。目前数字相位测量电路常采用过零比较法,此法受信号频率、时钟频率影响较大,在干扰较强时检测的准确度不够高。其他方法还有线性插值法,相关分析法,FFT频谱分析法,这些方法不是精度不够就是算法复杂。本文介绍的检测方法具有如下优势:①无需附加的相位校正
收稿日期:  修改日期:
措施;②精度较高,适合于精密测量场合;③计算量小,有利于实时实现;④具有很好的抑制频谱泄漏的性能,抗干扰性强,对输入信号无需经过复杂的处理。
STM32F103是ARM公司推出的以新一代内核Cortex2M3为内核的微处理器。Cortex2M3是一个32位
处理器内核。内部的数据路径是32位的,寄存器是32位的,存储器接口也是32位的。CM3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性能。STM32F103带有许多先进的外设比如双通道ADC,多功能定时器,通用输入输出端
口,七通道的DMA,高速通信口(SPI、I2C、USART等)。在软件支持方面,该公司提供了基本的固件库和DSP算法库,本系统需要用到算法库中的FFT函数库。
图1是相位检测系统的组成框图,其输入是2路AD采样电路,经Cortex2M3内核的全相位快速傅里叶变换算法(apFFT)的处理,由串口将计算结果输出。
电 子 器 件第33
图1 相位检测系统的组成框图
1 全相位快速傅里叶变换算法(apFFT)
文献[1]提出一种全相位FFT(all2phaseFFT,
简称apFFT或apFFT)谱分析方法,并指出apFFT比传统FFT具有更优良的抑制频谱泄漏性能。文献[2]提出apFFT具有“相位不变性”,该性质意味着
即使是在“不同步采样的情况”,无需借助任何附加的校正措施即可精确提取出信号相位信息,因而在相位计的设计、激光测距、较高的实用价值,于FFT,从而从量度上证明了
设AD的采样序列为[x0,x1,x2,x3,x4,…],做
N=3个点的包含x2的FFT变换所取的周期延拓信
图3 全相位数据处理等效框图
号有p1=[x0,x1,x2],p2=[x1,x2,x3],p3[x2,x3,
x4],这3个周期延拓信号相加形成一个新的全相位
周期延拓信号。而全相位数据最终也是形成一个长为N的向量P,其处理过程如图2所示。
上图可以转换为更直观的等效模式如图3所示。
图3表明:全相位处理等价于用一卷积窗WN,对以x2为中心的长为(2N-1)的数据向量进行加权处理,再移位求和。文献[1]证明:WN=f(n)?b(-n)例如无窗时,有f=b=RN(RN为矩形窗)
则当N=3时,WN=[111]?[111]=[12321]即为图2的三角加权窗。双窗时,f=b=WN(WN为任何对称窗,如汉宁窗等)。
经过以上处理得到了N个点的P向量,再对此P向量进行快速傅里叶变换(FFT)就是全相位快速傅里叶变换(apFFT)的计算过程。此时计算得到的数据含有的个频率点的相位信息无需校准了。在本系统中由于测得是单一频率信号,搜索结果中绝对值最大的那个点,其所对应相位就是所测量信号的相位。
2 系统设计
系统设计如图4所示。
为了减少成本采用了STM32F103T6U6,该芯片含
 第3期邱良丰,刘敬彪等:基于STM32的全相位FFT相位差测量系统
有36个引脚。16×12bit的ADC,2个串口,足够满足设计要求。系统共设计了4路ADC采样通道,及一路串口输出,供电电压VDD可取5V。为了实现相位差测量,必须先实现基本的FFT算法。ARM公司官网上提供了STM32F10x_DSP_Lib库,里面含有了基本的FFT算法。该库提供了64个点,256个点,以及1024个点的FFT算法。本文设计时采用64个点的FFT函数:
voidcr4_fft_64_stm32(void3pssOUT,void3ps2sIN,u16Nbin);其中pssOUT为输出数据所在数组
的特性。最关键的要求是噪声源应为白噪声。大多数使用12bitADC的应用都可以从过采样和求均值
技术获益。
理论上需要同时对2路AD信号进行采样,但是由于处理器的串行运算的特点,并不能做到真正的同时采样,假设某时刻对通道1进行采样,采样结束后马上对通道2进行采样,这时通道1和通道2之间的存在一个延时Δt该延时对应了一个固定的相位差δ=Δ?tf,
,可以通过先采集1,+,2然后采,用这些数据测得的相位差为Δ&-,2次测量结果取平均。
指针,pssIN为输入数据所在的数值指针,Nbin为输
入数据个数这里取值为64.需要注意的是数据的存放格式:所有数据必须是32位的数据:虚部放在高16位,实部放在低16位。
STM32F103xx基于Cortex2采样频率为1Msamples12ADC模块,要,但在某些精应用场合,使用STM32F10312bitADC并采用过采样和求均值技术即可达到以16bit分辨率进行参数测量的目的,而不必使用昂贵的片外16bitADC。同时可以节省外部器件的使用,减低功耗和成本。根据奈奎斯特定理,所要求的采样频率为奈奎斯特频率,即
(1)fs=2?fm
其中fm为输入信号的最高频率,fs为所需的采样频率。采样频率超过奈奎斯特频率即为过采样,过采样能提高分辨率。
为了增加有效位数(ENOB),信号被过采样,所需要的采样频率由系统对参数测量所要求的频度(输出数据字的速率)决定,每增加一位分辨率,信号必须被以4倍的速率过采样频率,即
(2)fos=4?fs其中,w希望增加的分辨率位数;fs初始采样频率要
求;fos过采样频率。
假设一个系统使用12bit的ADC。每秒输出一个值(1Hz)。为了将测量分辨率增加到1bit,按下式
计算过采样频率,即fos=4?1=256Hz。因此,如果以fos=256的采样频率进行过采样,则将在所要求的采样周期内采集到足够的样本,对这些样本求均值便可得到1bit的输出数据。为此,先累加(将256个连续样本加在一起),然后将总和除以16。这样的过程通常被称为抽取。这样得到的结果是16bit的有用数据,所做的操作被称为累加和抽取。一旦计算得到由256个样本所产生的结果,将对数据进行保存或处理,然后开始为下一个输出字采集样本。
过采样和求均值法的有效性取决于主要噪声源
3 试验方法与结果
原本系统通过AD采样,将采样结果保存到数组中,然后通过算法计算相位差,由于较难获得已知相位差的输入信号,所以这里才用一种折中的方法,即AD采样由计算机完成,采样的结果以数组的方式保存到STM32MCU中作为AD实际的采样结果,由此数据来测试系统的误差。
在MATLAB中采样信号为:
π(N-1)]?x=2?cos(2??[-(N-1)∶f0/fs+
π)+0.1?π(N-1)]?alp/180?cos(2??[-(N-1)∶
π)+3;f0?1.1/fs+alp/180?
π?[-(N-1)∶(N-1)]?上式中2?cos(2?
π)为输入信号采样。f0/fs+alp/180?π(N-1)]?0.1?cos(2??[-(N-1)∶f0?1.1/fs+π)+3为干扰信号采样。考虑到实际情况,alp/180?加入此干扰信号。
各变量含义如下:
2N-1:采样个数,f0:输入频率,fs:采样频率,alp:相位差
考虑到实际12bitAD采样的分辨率为:3.3/12
2=0.5,至少3位有效数字。
所以最终采样值sample=floor(x?100),即取2位有效数字,并放大100倍.
取N=64,f0=1000,fs=8000,改变alp的值,产生一系列的sample.
例如alp=149.5时sample采样值为
sample={106,206,359,477,490,392,241,125,112,208,357,471,485,391,245,131,115,206,351,465,483,395,251,136,115,202,345,462,485,400,257,137,112,195,341,463,490,406,259,135,106,190,340,467,496,410,
电 子 器 件第33卷
258,129,100,188,343,473,501,411,254,123,96,190,348,478,503,407,248,119,96,194,354,482,501,402,242,117,100,200,359,481,496,396,240,120,106,206,359,477,490,392,241,125,112,208,357,471,485,391,245,131,115,206,351,465,483,395,251,136,115,202,345,462,485,400,257,137,112,195,341,463,490,406,259,135,106,190,340,467,496,410,258};保存到系统中
误差造成的。如果能提高FFT计算的位数比如实部采用32位,虚部也采用32位来表示,计算精度就
会提高很多,但是计算速度也会慢很多。参考文献:
[1] 王兆华,侯正信,苏飞,等.全相位FFT频谱分析.通信学报,
[2]黄翔东,王兆华.一种设计频率特性有间断滤波器的新方法
[J].天津大学学报,2006,():-620.
测试结果为alp=149。
总体测试如下:
输入相位差(度)
.580.149.5
实测相位差(度)
[3]IgnadoCarlosI.StudyofHigh2Accu2racyatiJSystemsandPr5):819-834.
.STM32F10xxxDSPLibraryVersion[S]..
STMicroelectronics.ImprovingSTM32F101xxandSTM32F103xxADCResolutionbyOversampling[S].2008.
STMicroelectronics.HowtoGettheBestADCAccuracyinSTM32F10xxxDevices[S].2008.
[7]江亚群,何怡刚.基于加窗FFT的相位差高精度测量算法.电
路与系统学报,10(2)
[8]丁康,罗江凯,谢明,等.离散频谱时移相位差校正法[J].应
  由一上结果可以看出相位分辨率可以达到1
度。这主要由测量电压舍入误差,和FFT计算舍入
用数学和力学,2002,
23(7):729-735.
邱良丰(1985-),男,浙江省杭市人,现为杭州电子科技大学研究生,电路与系统专业。
目前主要从事海洋机电控制装备的设计与研究,gilbert0571@
刘敬彪(1964-),男,江西省吉安市人,教授,长期从事海洋电子信息系统集成技术研究,ab@;
于海滨(1979-),男,辽宁省大连市人,博士,现主要从事数字信号处理与嵌入式系统方面的研究,shoreyhb@
Matlab程序:
邱良丰,刘敬彪等:基于STM32的全相位FFT相位差测量系统
文件fsample.M
functiony=fsample(alp)globalf0fssampleN
x=23cos(23pi3[-(N-1):(N-1)]3f0/fs+alp/1803pi)+0.13cos(23pi3[-(N-1):(N-1)]3f031.1/fs+alp/1803pi)+3;
sample=floor(x3100);y=
采样数据产生如下:
globalf0fssampleN
f0=1000,fs=8000,N=64
fsample(149.5)%产生对应相位差为149.5度的采样数据,保留2位
将数据拷贝到系统程序中,运行得到结果为-149,其绝对误差为0.5
三亿文库包含各类专业文献、文学作品欣赏、高等教育、生活休闲娱乐、基于STM32的全相位FFT相位差测量系统_图文29等内容。 
 网页 新闻 贴吧 知道 音乐 图片 视频 地图 文库 |...基于STM32的全相位FFT相... 6页 免费
激光自...基于FFT的相位差测量及虚... 5页 1下载券
基于...  基于STM32的FFT傅里叶变换_信息与通信_工程科技_...// 定义测量参数 /***...(float number) //差分 { long i = 0; float x = 0, y = 0; const...  使用STM32_的DSP库进行FFT变换说明及例程_电子/电路...都会导致 MDK 下次编译时会编译全部文件,速度太慢。...FFt,采样率 3200Hz,频率分辨率 50Hz,测量最大有效...  基于STM32芯片的128点FFT_信息与通信_工程科技_专业资料。STM32 的 FFT 实现 ...基于STM32的全相位FFT相... 5页 免费
嵌入式系统中FFT算法研究... 8页 ...  1 基于 STM32 官方 DSP 库的 FFT 算法工程文件中包含三个函数库,分别为: cr4_fft_64_stm32.s cr4_fft_256_stm32.s cr4_fft_1024_stm32.s 分别对应...  0........FFT 法,无论在相位差测量准确度还是重复性都有一定...基于最小二乘法的相位测量算法.电光与控制,2007,14...  FFT,PID 等都是用汇编写的。 将 ST 提供的 FFT...接下来就是代码了: #include &stm32f10x_lib.h&...(); //点阵初始化 //系统时钟设置 72Mhz //...  13 1 基于 STM32 DSP 库的音乐频谱设计报告 摘要:本作品是基于 STM32 和 ...但由于代码优化不够导致运算一次 FFT 时间稍有延迟, 另外系统的功能有点 单一只...  基于全相位 FFT 的振弦式传感器频率测量系统设计 3...一种基于 STM32 和 PPG 技术的腕戴式心率计设计...电动轮驱动车辆电子差速技术研究 100……基于绿色...

我要回帖

更多关于 555频率可调 的文章

 

随机推荐