用ADC采样,怎么用TIM定时器来控制每隔一段时间采集一个数据呢?求赐教。

2019-10-14 23:26发布

买了原子哥的开发板已经一个月勒,目前还是个小白。
发现这个STM32还是蛮难的,各种参数之间的关系搞的晕头转向的。。。
最近在看ADC这个东西,我输入一个电压信号,用ADC也采集到了,采到的值也是对的。
      现在我想要在这基础上增加一个TIM定时功能,每隔一小段时间读一个ADC的值。然后就没有然后了,搞了一天多还没搞定,网上也没查到我想要的,所以特来论坛向大神们请教
   下面这个是TIM3的初始化
    void Timer_Configuration(void)
{       
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;               //2k的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 500-1;                  // 计数到500产生一个更新事件
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);         //允许更新中断
TIM_Cmd(TIM3, ENABLE); //使能TIM3


下面这个是TIM3的中断函数,我就想每隔一段时间读一下ADC的值,不要刷新的太快而已。
void TIM3_IRQHandler(void)
{
u16 ad_value1;    

 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)      //检测是否发生溢出更新事件
{
   ad_value1=ADC_RegularConvertedValueTab;       //我就想在每次中断的时候读一下ADC的值,这里是不是不对啊。。。
   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);           //清除中断标志位
}

下面是之前的main函数,我仿真的时候能看到ADCzhi在一直变化。
u16 ADCzhi;
while (1)
{
       ADCzhi=ADC_RegularConvertedValueTab;        //ADC_RegularConvertedValueTab表示ADC的值
}
ADC的那一段函数就不贴上来了,感觉那个好像没什么问题。
大神们给我指点一下吧。。。不胜感激啊


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
33条回答
TinyBoy
1楼-- · 2019-10-17 14:47
 精彩回答 2  元偷偷看……
STM32VBT6
2楼-- · 2019-10-17 17:33
再告诉你一个秘密,定时器启动后会立即进入更新中断(如果打开的话),如果你预期是先定时一段时间再采集的话,可能就多了一次启动时的。
这个对你的实验倒是没什么影响,可是中断要是作为计数的话,就要出大问题了,会多记一次!
建议你将:
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);         //允许更新中断
TIM_Cmd(TIM3, ENABLE); //使能TIM3
改为:
1.启动定时器;
2.清除更新中断标志;
3. 使能更新中断。
这样就确定了初始状态,结果可控了。
不信你做个实验测试一下。
fxltsbl007
3楼-- · 2019-10-17 19:43
回复【21楼】STM32VBT6:
---------------------------------
额,这样的啊。我再网上看资料,有的里面加了清除更新的代码,有的没有加,也不太明白在软件里面具体是怎么执行的,就没有加。谢谢了啊。

主要是通用定时器的教程里面好像也没这句代码,哈哈。我现在还是以模仿别人写的代码为主。现在知道这句话的意思勒。

话说不知道再过两个月能不能入门,,,每天老板问我学到什么地步了,都压力好大啊。
fxltsbl007
4楼-- · 2019-10-18 01:33
回复【21楼】STM32VBT6:
---------------------------------
TIM_ClearFlag(TIM3, UPdate);
你说的清除中断标志是不是就是这句啊
TinyBoy
5楼-- · 2019-10-18 07:00
回复【22楼】fxltsbl007:
---------------------------------
 没事了,你慢慢调,用示波器看节拍对不对,对了,说明代码是对的,不对再改,反正你可以设置几百MS采样ADC一次,启动进入一次中断也无妨。
fxltsbl007
6楼-- · 2019-10-18 11:44
 精彩回答 2  元偷偷看……

一周热门 更多>