|
发表于 2011-4-11 16:57:38
|
显示全部楼层
回复【95楼】kevinzcp
回复【93楼】cyxavr 又一天
-----------------------------------------------------------------------
可能是滤波器的输入阻抗不匹配造成的,可以换个阻值的电位器来调幅度或电位器后增加一级跟随。
-----------------------------------------------------------------------
还有一个问题:
7135 的时钟输入为250K,我用STM32 定时器3通道4来做输入捕捉(上升沿捉一次,下降沿再捉一次,取两次差值),但捕捉到的数据老在跳变
楼主,请教一下,7135 BUSY 最长的高电平与低时间大概各为多少MS啊?
上传工程文件与原理图
没有8MHZ的晶振,我用6MHZ的,升频到54MHZ。
7135 时钟大约在500K左右,现在是知道如何设置STM32捕捉的频率!?
/*定时器5(16位)通道2 PA1(26脚)输出500k的PWM到ICL7153的CLK 脚(22脚),作为时钟信号*/
void TIM2_Out_Clk_125k_Setup(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR2_Val ;
// u32 F_HZ=54000000/Prescale;
// u16 F_10kHZ= F_HZ/10000 ; //1000000/125000(125khz)=8
// u16 F_1kHZ= F_HZ/1000 ; //1000000/1000(1khz)=1000
// u16 F_100HZ= F_HZ/100 ; //1000000/100(100hz)=10000
TIM_TimeBaseStructure.TIM_Prescaler =18;// 预分频,此值+1为分频的除数 3M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 6;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
CCR2_Val=3;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_Low;//TIM_OCNPolarity_High //关闭反向通道
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_Cm(TIM2,ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE);
}
/*定时器3通道4输入捕捉*/
void TIM3_ICAP_Setup(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_TimeBaseStructure.TIM_Period = 0xffff; // ????
TIM_TimeBaseStructure.TIM_Prescaler = 99; //分频后为54M/(99+1)=540K ???
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM3, 99,TIM_PSCReloadMode_Immediate );
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //选择通道4
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //通道方向选择
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter = 0x03;//脉冲滤波
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); //参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); // 打开中断
TIM_Cmd(TIM3, ENABLE);
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
}
void TIM3_IRQHandler (void)
{
#define OFFSET7135 7657
TIM_ICInitTypeDef TIM_ICInitStructure;
if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
if(TIM3ICValue1==0)
{
TIM3ICValue1=TIM_GetCapture4(TIM3);
//test1();
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //选择通道3
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//输入下降沿捕获 TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //通道方向选择 //将TI2配置到PA1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter = 0x03;//脉冲滤波
TIM_ICInit(TIM3, &TIM_ICInitStructure);
GPIOA->ODR ^= GPIO_Pin_12;
if(GPIO_ReadInputDataBit(ICL7135_POLE_PORT,ICL7135_POLE_PIN))//读7135 POLH引脚电平是否为高?
POLE_7135_FLAG = 1;
else
POLE_7135_FLAG = 0;
}
else
{
TIM3ICValue2=TIM_GetCapture4(TIM3);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //选择通道3
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//TIM_ICPolarity_Rising; //输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //通道方向选择 //将TI2配置到PA1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter = 0x03;//脉冲滤波
TIM_ICInit(TIM3, &TIM_ICInitStructure);
ResultAD7135=(1.0001*(TIM3ICValue2-TIM3ICValue1-OFFSET7135))/OFFSET7135;//得到AD值
if(!POLE_7135_FLAG) ResultAD7135 = -1*ResultAD7135; //判断信号的正负
// sprintf(DisL2Buf,"7135:%.3f",ResultAD7135);//打开此处注释短接7135第9-10脚显示出的数即为 OFFSET7135
// test_ax();
// test2() ;
GPIOA->ODR ^= GPIO_Pin_15;
TIM3ICValue1 = 0;
TIM3ICValue2 = 0;
TIM3INTCount=1;
}
}
}
还有其他的看工程文件。
里面有IAR 源码文件与PDF 原理图ourdev_629986UDNIW4.zip(文件大小:584K) (原文件名:IAR STM32 LCR.zip) |
|