OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2793|回复: 6

用输入捕获来来检测两次上升沿来开始和结束AD测量

[复制链接]

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
发表于 2017-8-18 10:00:02 | 显示全部楼层 |阅读模式
30金钱
输入捕获测方波信号的上升沿,输入捕获脚测到第一个上升沿的时候AD开始采集,测到第二个上升沿的时候AD停止采集,AD的采样频率为200KHz,AD的输入的正弦信号的频率为610Hz,理论上一个周期可以采集327个点,但是现在每一周期(输入捕获的两个上升沿之间)采集的点数都不够定,例如90多,100多,200多。程序如下!不知道是什么原因用的是Mini开发板,之后自己搭的电路

不知道是自己的逻辑有问题,还是输入捕获的问题,请大家帮忙
这是主函数
int main(void)
{
         u16 AData1,AD_temp,AData,AD_temp1,AD_temp2;
         u16 AData2;
         u16 led0pwmval=0,i=0;
         uint16_t AD_Buf[ADSampNumMax]={0};
         u16 Demo[ADSampNumMax]={0};
   u16  a,m=0,k=0,ii=0;
         u16 AD_SUM,AD_SUM1=0;
   u16  ADSampNowNum=0;         
        float v;
        //unsigned int ADbuffer[8];
        // EXTIX_Init();       
        delay_init();                     //          
  TIM2_Cap_Init(0xffff,2-1);
        TIM1_PWM_Init(359,0);                         //
        uart_init(9600);                 //
  AD_Init();

                       
                delay_ms(10);         
          led0pwmval=288;        //DUTY  20%                                            

               
                        if(TIM1CH1_CAPTURE_FLAG1)              //这里是判断是检测到一个上升沿开始AD读数,又检测到一个上升沿停止读数的一个逻辑
                                TIM1CH1_CAPTURE_FLAG1=0;
                        while(!TIM1CH1_CAPTURE_FLAG1)
                        {
                                while(!BUSY);
                                        AData1=GPIO_ReadInputData(GPIOB)&0xFFFF;
                      AD_Buf[ADSampNowNum]=AData1;
                ADSampNowNum++;
                                        while(BUSY);       
                        }                       
                                        a++;
                       
                                        for(ii=0;ii<327;ii++)
                        {
                                AData2=AD_Buf[ii];
                                        printf("%d,\r\n ",AData2 );
               
                        }
     printf("%d,\r\n ",ADSampNowNum );
        }


输入捕获中断服务函数
void TIM2_IRQHandler(void)
{
        TIM1CH1_CAPTURE_FLAG1=0;
                        if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)                 //
                {

                                ICP4_T1 = TIM_GetCapture1(TIM2);                //
                                TIM1CH1_CAPTURE_STA |= 0X40;                //
                                TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising);//
                                TIM1CH1_CAPTURE_FLAG1=1;  //检测到上升沿将这个变量赋值
                }
                 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //
        }


TIM_ICInitTypeDef TIM2_ICInitStructure;

void TIM2_Cap_Init(u16 arr, u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //ê1&#196;üTIM4ê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //ê1&#196;üGPIOBê±&#214;ó

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //PB8 &#199;&#229;3y&#214;&#174;&#199;°éè&#214;&#195;  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB8
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA, GPIO_Pin_0 );//PB7  &#207;&#194;à-

        //3&#245;ê&#188;&#187;ˉ&#182;¨ê±&#198;÷4 TIM4         
        TIM_TimeBaseStructure.TIM_Period = arr; //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
        TIM_TimeBaseStructure.TIM_Prescaler = psc;         //&#212;¤·&#214;&#198;μ&#198;÷
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //&#184;ù&#190;YTIM_TimeBaseInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;

        //3&#245;ê&#188;&#187;ˉTIM4ê&#228;è&#235;2&#182;&#187;&#241;2&#206;êy í¨μà1
        TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         &#209;&#161;&#212;&#241;ê&#228;è&#235;&#182;&#203; IC1ó3é&#228;μ&#189;TI1é&#207;
        TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //é&#207;éy&#209;&#216;2&#182;&#187;&#241;
        TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3é&#228;μ&#189;TI1é&#207;
        TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;          //&#197;&#228;&#214;&#195;ê&#228;è&#235;·&#214;&#198;μ,2&#187;·&#214;&#198;μ
        TIM2_ICInitStructure.TIM_ICFilter = 0x00;          //IC1F=0000 &#197;&#228;&#214;&#195;ê&#228;è&#235;&#194;&#203;2¨&#198;÷ 2&#187;&#194;&#203;2¨
        TIM_ICInit(TIM2, &TIM2_ICInitStructure);

        //&#214;D&#182;&#207;·&#214;×é3&#245;ê&#188;&#187;ˉ
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM4&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;2&#188;&#182;
//        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //′óó&#197;&#207;è&#188;&#182;0&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±&#187;ê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);   //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷

        TIM_ITConfig(TIM2, TIM_IT_CC1,ENABLE);   //2&#187;&#212;êDí&#184;üD&#194;&#214;D&#182;&#207;£&#172;&#212;êDíCC1IE2&#182;&#187;&#241;&#214;D&#182;&#207;       

        TIM_Cmd(TIM2, ENABLE);                 //ê1&#196;ü&#182;¨ê±&#198;÷4


微信截图_20170818094914.png

最佳答案

查看完整内容[请看2#楼]

自己顶一下吧!需要大神帮我分析一下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
 楼主| 发表于 2017-8-18 10:00:03 | 显示全部楼层
自己顶一下吧!需要大神帮我分析一下
回复

使用道具 举报

14

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-10-27
在线时间
48 小时
 楼主| 发表于 2017-8-26 13:50:03 | 显示全部楼层
原子哥,请帮忙分析一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-8-28 01:31:42 | 显示全部楼层
摩天轮转了 发表于 2017-8-26 13:50
原子哥,请帮忙分析一下

仿真找问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

83

主题

553

帖子

0

精华

高级会员

Rank: 4

积分
787
金钱
787
注册时间
2014-9-30
在线时间
134 小时
发表于 2017-8-28 12:04:50 | 显示全部楼层
摩天轮转了 发表于 2017-8-21 07:59
自己顶一下吧!需要大神帮我分析一下

你自己 把叙述 搞 那么 绕:
{输入捕获测方波信号的上升沿,输入捕获脚测到
第一个上升沿的时候AD开始采集,测到第二个上升沿的时候AD停止采集}


简单点:某个引脚的:上升沿 开始采集,再来个上升沿 停止采集,
这只算是 门控信号 而已。你 AD 采样定时周期要满足 1/ 200KHz


也就是说:你要 精确定时 5uS 的 中断周期 再配合 门控信号。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2017-8-28 17:11:03 | 显示全部楼层
既然用捕获,那就先测测你的方波是不是准确的610HZ,代码太长了不看
我有故事,你有酒吗
回复

使用道具 举报

10

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2017-4-20
在线时间
102 小时
发表于 2017-8-28 17:24:33 | 显示全部楼层
如果程序软件都没错 查查硬件问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 19:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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