打印

关于采样的配置和完成后触发中断

[复制链接]
3114|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
djz1992|  楼主 | 2016-1-15 16:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 djz1992 于 2016-1-22 14:00 编辑

1.我想要设置采样为 ADC_TRIGGER_TIMER定时器触发,采样频率12.8K,每0.02s采样256次。
除了要ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMEr, 0);这一句外,时间控制用什么来配置?
难道是通过配置采样频率为12.8K?程序会自动控制采样周期?SysCtlADCSpeedSet(SYSCTL_ADCSPEED_12.8KSPS)?
2.采样完成后是不是会自动进入ADC中断?中断触发有三种,软件触发、DMA、和模拟比较器,@xyz549040622 默认的中断触发是软件触发,是不是采样结束进入中断?
我在中断里把瞬时值保存到数组,然后在主函数将256个数据求平方和后开方,就得到了交流电压的有效值。


求有效值的代码我写好了。以下是我的采样配置部分的代码,帮我看看我的理解写的备注是否正确,另外是否可以实现我所需要的功能。
       //初始化ADC0/PE3
        //SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS);//设置采样速度,默认1MHZ
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
        GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
        GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
        //设置ADC参考电压为外部3V,TM4C123GH6PM只能使用内部参考电压,3.3V
        //ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V);//若ADC_REF_INT,则指使用内部3V参考电压
        //配置ADC采集序列,ADC_TRIGGER_PROCESSOR是软件触发,ADC_TRIGGER_TIMER是定时器触发
        ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMER, 0);
        ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 );//PE3
        ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH1 );//PE2
        ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH2 );//PE1
        ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH3 );//PE0
        ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH4 );//PD3
        ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH5 );//PD2
        ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH6 | ADC_CTL_IE |ADC_CTL_END);//PD1
        ADCSequenceEnable(ADC0_BASE, 0);//使能ADC采集序列
        IntMasterEnable();//总中断使能
        IntEnable(INT_ADC0SS0); //使能ADC采样序列中断
        ADCIntEnable(ADC0_BASE, 0);//这一句和上一句是不是一个意思?
        ADCIntEnableEx(ADC0_BASE,ADC_INT_DMA_SS0);//中断触发设置
        ADCIntClear(ADC0_BASE, 0);

void ADC0IntHandler(void)
{
    ADCSequenceDataGet(ADC0_BASE, 0, ADC0_Value);
     for(i=0;i<8;i++)
     {VALUE【i】=VALUE【i】+(ADC0_Value【i】* ADC0_Value【i】);}

结论已经有了,请看到最后!!


相关帖子

来自 2楼
djz1992|  楼主 | 2016-1-22 13:56 | 只看该作者
我发现错误所在了,TimerControlTrigger(ADC0_BASE,TIMER_A,true);这一句配置错了,
应该是TimerControlTrigger(TIMER0_BASE,TIMER_A,true);换成这一这一句后终于搞定了,
鬼使神差的胡乱复制搭配,鬼使神差的成功了,在一点点的找,才发现,搞了我一个礼拜反复尝试。

使用特权

评论回复
来自 3楼
djz1992|  楼主 | 2016-1-22 14:02 | 只看该作者
而且我发现
ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0)
TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);
这两句可以去掉,一样的效果

使用特权

评论回复
地板
djz1992|  楼主 | 2016-1-15 16:29 | 只看该作者
@xyz549040622 谢谢大神每次都耐心教导

使用特权

评论回复
5
djz1992|  楼主 | 2016-1-15 16:29 | 只看该作者
@xyz549040622

使用特权

评论回复
6
xyz549040622| | 2016-1-15 18:29 | 只看该作者
给你个参考,具体还是需要你测试的
1.你说的那几种,不是中断的触发,是采样发生的触发
2.关于采样频率的设置,一般是设置定时器的频率,然后把ADC的读取放在中断中。直接设置采样频率,你可以试试
3.关于ADC的中断,一般是某通道采样完成后,触发中断的。

使用特权

评论回复
7
dirtwillfly| | 2016-1-15 20:39 | 只看该作者
xyz549040622 发表于 2016-1-15 18:29
给你个参考,具体还是需要你测试的
1.你说的那几种,不是中断的触发,是采样发生的触发
2.关于采样频率的设 ...

使用特权

评论回复
8
vivilzb1985| | 2016-1-15 22:24 | 只看该作者
这个是采用连续通道扫描的方式来采集数据的。

使用特权

评论回复
9
shenmu2012| | 2016-1-15 23:11 | 只看该作者
内部的参考电压是很重要的。

使用特权

评论回复
10
xyz549040622| | 2016-1-16 08:48 | 只看该作者

使用特权

评论回复
11
dirtwillfly| | 2016-1-16 09:12 | 只看该作者
xyz549040622 发表于 2016-1-16 08:48
灰哥威武

汗~~

使用特权

评论回复
12
djz1992|  楼主 | 2016-1-18 08:23 | 只看该作者
vivilzb1985 发表于 2016-1-15 22:24
这个是采用连续通道扫描的方式来采集数据的。

嗯哼,那具体的代码操作有什么案例么

使用特权

评论回复
13
djz1992|  楼主 | 2016-1-18 08:27 | 只看该作者
xyz549040622 发表于 2016-1-15 18:29
给你个参考,具体还是需要你测试的
1.你说的那几种,不是中断的触发,是采样发生的触发
2.关于采样频率的设 ...

如果在定时器中断内用语句触发,我觉得应该还是属于控制器软件触发,只是通过定时器来控制了触发频率。
而图中第二个定时器触发,我觉得是不是应该是设定好频率后自动触发,而不需要在定时器中断内反复执行触发语句。

使用特权

评论回复
14
djz1992|  楼主 | 2016-1-18 08:36 | 只看该作者
xyz549040622 发表于 2016-1-15 18:29
给你个参考,具体还是需要你测试的
1.你说的那几种,不是中断的触发,是采样发生的触发
2.关于采样频率的设 ...

我且多试一试

使用特权

评论回复
15
xyz549040622| | 2016-1-18 10:37 | 只看该作者
djz1992 发表于 2016-1-18 08:27
如果在定时器中断内用语句触发,我觉得应该还是属于控制器软件触发,只是通过定时器来控制了触发频率。
...

只能试试了,这个我也没测试过。

使用特权

评论回复
16
djz1992|  楼主 | 2016-1-18 13:53 | 只看该作者
本帖最后由 djz1992 于 2016-1-18 14:52 编辑
xyz549040622 发表于 2016-1-18 10:37
只能试试了,这个我也没测试过。

查阅资料,代码有以下改进。
ADCSequenceConfigure(ADC0_BASE, 0,ADC_TRIGGER_TIMER, 0);。。。。。。。

ADCSequenceEnable(ADC0_BASE, 0);//使能ADC采集序列
        IntMasterEnable();
        IntEnable(INT_ADC0SS0); //使能ADC采样序列中断
        ADCIntEnable(ADC0_BASE, 0);
        //中断触发方式设置ADC_INT_SS0、ADC_INT_DMA_SS0、ADC_INT_DCON_SS0
        ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);//分别代表普通序列触发、DMA触发和数字比较器触发
        ADCIntClear(ADC0_BASE, 0);
        TimerControlTrigger(ADC0_BASE,TIMER_A,true);



1.ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);中断触发方式设置为普通
2.ADCProcessorTrigger(ADC0_BASE, 0);     应该改为    TimerControlTrigger(ADC0_BASE,TIMER_A,true);
其中 第二位TIMER_A,第三位为true


写了中断void ADC0IntHandler(void),在是startup里也注册了。
然后我发现有这么两个函数
TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);这句是在定时器里配置当TIME_A超时后触发ADC
TimerADCEventGet(TIMER0_BASE);这一个应该是获取是否触发超时ADC采样
第一个放在TIMER的初始化里,但是第二句应该放在哪里呢

使用特权

评论回复
17
djz1992|  楼主 | 2016-1-18 15:27 | 只看该作者
xyz549040622 发表于 2016-1-18 10:37
只能试试了,这个我也没测试过。

貌似可以了,把
TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);
TimerADCEventGet(TIMER0_BASE);
这两句都放在定时器的初始化里,采样初始化里用 TimerControlTrigger(ADC0_BASE,TIMER_A,true);

使用特权

评论回复
18
xyz549040622| | 2016-1-18 16:13 | 只看该作者
djz1992 发表于 2016-1-18 15:27
貌似可以了,把
TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);
TimerADCEventGet(TIMER0_BASE);

赞一个,又学到了一种新的办法。

使用特权

评论回复
19
djz1992|  楼主 | 2016-1-18 16:56 | 只看该作者
xyz549040622 发表于 2016-1-18 16:13
赞一个,又学到了一种新的办法。

又不行了,刚刚还可以定时进ADC中断的。。。现在死活进不去。。愁煞人

使用特权

评论回复
20
djz1992|  楼主 | 2016-1-21 15:51 | 只看该作者
xyz549040622 发表于 2016-1-15 18:29
给你个参考,具体还是需要你测试的
1.你说的那几种,不是中断的触发,是采样发生的触发
2.关于采样频率的设 ...

老大,帮我看看到底怎么配置才能用定时器自动触发采样呢。

使用特权

评论回复
21
拉克丝| | 2016-1-21 20:20 | 只看该作者
一般是设置定时器的频率,然后把ADC的读取放在中断中

使用特权

评论回复
22
tongbu2015| | 2016-1-21 23:22 | 只看该作者
这个是查询法采集数据的方式的,注意延时控制的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:人生苦短,冬日苦长,正是青葱,却无骄阳

115

主题

620

帖子

5

粉丝