OpenEdv-开源电子网

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

用定时器触发AD,为何不能触发,串口打印结果始终为零

[复制链接]

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
发表于 2014-1-14 15:20:44 | 显示全部楼层 |阅读模式
void tim1_init()      //AD采样中断用
{
TIM_DeInit(TIM1);     
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef       TIM_OCInitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
  
TIM_TimeBaseStructure.TIM_Period =0x4;             //自动装载计数值
TIM_TimeBaseStructure.TIM_Prescaler=0xFF;            //预分频系数值
TIM_TimeBaseStructure.TIM_ClockDivision=0;         //分频比例
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //向上计数方式
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//初始化TIM1
    //TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
//TIM_ClearITPendingBit(TIM1,TIM_IT_Update);                 //清除溢出中断标志
//TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);  //打开溢出中断标志
TIM_OCStructInit(&TIM_OCInitStructure);  
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
//TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 
    //TIM_ARRPreloadConfig(TIM1, ENABLE); 
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE);
}

int main(void)
{
tim1_init();
com_232();
ADC_GPIO_Configuration();
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 
  /* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;   
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value; 
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = M;   
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //DMA搬数据尺寸,HalfWord就是为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   //转换模式,循环缓存模式。
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //M2M模式禁用
DMA_Init(DMA1_Channel1, &DMA_InitStructure);          
DMA_Cmd(DMA1_Channel1, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
  
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;  
//ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  
ADC_InitStructure.ADC_NbrOfChannel = M;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10,1, ADC_SampleTime_239Cycles5);
ADC_DMACmd(ADC1, ENABLE);  //ADC命令,使能
  ADC_Cmd(ADC1, ENABLE);  //开启ADC1
  ADC_ResetCalibration(ADC1);  //重新校准
while(ADC_GetResetCalibrationStatus(ADC1));  //等待重新校准完成
ADC_StartCalibration(ADC1); //开始校准
while(ADC_GetCalibrationStatus(ADC1));   //等待校准完成
//ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC通过DMA方式不断的更新RAM区。
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
   
while (1)
{
filter_2();
filter_printf_2();   
    Delay_ARMJISHU(1000000);
}
}

求指点,谢谢啊!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-14 16:24:18 | 显示全部楼层
你这AD采集的数据怎么读取的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-14 16:31:45 | 显示全部楼层
void filter_2()      //6个通道均值
{    
int sum1=0;
int sum2=0;
   int sum3=0;
int sum4=0;
int sum5=0;
int sum6=0;

u16 count;
u16 k=0;
for(k=0;k<N;k++)
{
for(count=0;count<M;count++)
{
switch(count)
{
case 0:AD_Channel1[k]=AD_Value[count];
       sum1+=AD_Channel1[k];
break;

case 1:AD_Channel2[k]=AD_Value[count];
       sum2+=AD_Channel2[k];
break;

case 2:AD_Channel3[k]=AD_Value[count];
       sum3+=AD_Channel3[k];
break;

case 3:AD_Channel4[k]=AD_Value[count];
       sum4+=AD_Channel4[k];
break;

case 4:AD_Channel5[k]=AD_Value[count];
       sum5+=AD_Channel5[k];
break;

case 5:AD_Channel6[k]=AD_Value[count];
       sum6+=AD_Channel6[k];
break;

default:
break;
}
}

table[0]=sum1/128;
table[1]=sum2/128;
table[2]=sum3/128;
table[3]=sum4/128;
table[4]=sum5/128;
table[5]=sum6/128;
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
sum6=0;
}

从AD_Value中读取DMA缓冲器数据。上面程序以单通道为例,实际程序中开启6个通道,这部分程序为读取每个通道128个点。>
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-14 16:35:01 | 显示全部楼层
使用软件触发方式能够实现,采用定时器1的T1—CC1事件确触发不了,是不是PWM1这方面配置出现问题,求解。谢谢啊!
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-14 16:41:33 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
void filter_2()      //6个通道均值
{    
int sum1=0;
int sum2=0;
   int sum3=0;
int sum4=0;
int sum5=0;
int sum6=0;

u16 count;
u16 k=0;
for(k=0;k<N;k++)
{
for(count=0;count<M;count++)
{
switch(count)
{
case 0:AD_Channel1[k]=AD_Value[count];
       sum1+=AD_Channel1[k];
break;

case 1:AD_Channel2[k]=AD_Value[count];
       sum2+=AD_Channel2[k];
break;

case 2:AD_Channel3[k]=AD_Value[count];
       sum3+=AD_Channel3[k];
break;

case 3:AD_Channel4[k]=AD_Value[count];
       sum4+=AD_Channel4[k];
break;

case 4:AD_Channel5[k]=AD_Value[count];
       sum5+=AD_Channel5[k];
break;

case 5:AD_Channel6[k]=AD_Value[count];
       sum6+=AD_Channel6[k];
break;

default:
break;
}
}

table[0]=sum1/128;
table[1]=sum2/128;
table[2]=sum3/128;
table[3]=sum4/128;
table[4]=sum5/128;
table[5]=sum6/128;
sum1=0;
sum2=0;
sum3=0;
sum4=0;
sum5=0;
sum6=0;
}
从AD_Value中读取DMA缓冲器数据。上面程序以单通道为例,实际程序中开启6个通道,这部分程序为读取每个通道128个点。>
使用软件触发方式能够实现,采用定时器1的T1—CC1事件确触发不了,是不是PWM1这方面配置出现问题,求解。谢谢啊!
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-14 17:12:29 | 显示全部楼层
回复【5楼】玉落彼岸:
---------------------------------
恩,你的ADC和DMA方式没问题,我怀疑你的PWM产生有问题,你用PWM1模式的话,把TIM_OCPolarity设置为低试试。TIM_OCInitStructure.TIM_Pulse=0;这句话也不用
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-14 18:18:26 | 显示全部楼层
回复【6楼】hechao3225:
---------------------------------
谢谢啊!我尝试下。
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-15 08:06:43 | 显示全部楼层
回复【6楼】hechao3225:
---------------------------------
您好!你说的这种方法,已经测试过,串口打印的结果还是为零。请问,还有其他解决办法吗?谢谢。
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-15 11:18:34 | 显示全部楼层
回复【8楼】玉落彼岸:
---------------------------------
仿真看看吧,一部分一部分调,先看PWM输出有没有问题,再看串口能否正常收发,最后调ADC_DMA转换
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-15 16:39:37 | 显示全部楼层
回复【9楼】hechao3225:
---------------------------------
问题已解决,PWM输出问题,谢谢回复。
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 00:51:03 | 显示全部楼层
回复【10楼】玉落彼岸:
---------------------------------
是PWM问题吧。。具体什么问题?分享下
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-16 10:27:13 | 显示全部楼层
回复【11楼】hechao3225:
---------------------------------
TIM_OCInitStructure.TIM_Pulse=0;这句占空比不能为0,另附,为何定时器1的CC1事件不能触发AD而CC2确能够。
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 11:33:35 | 显示全部楼层
回复【12楼】玉落彼岸:
---------------------------------
这句改CCRy寄存器的值从而修改占空比,初始化可以设好也可以不用,后面可以用TIMx_SetCompare()来随时修改CCRy,我以为你后面输出修改了占空比。定时器触发有通道限定的,见下图
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 11:38:30 | 显示全部楼层






   这样看来TIM1的CH1是可以触发ADC1和ADC2的,不能触发ADC3.你看看配置有没有出错
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-16 11:39:52 | 显示全部楼层
回复【13楼】hechao3225:
---------------------------------
是的,谢谢回复,好像不能上图。没看到图片。
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-16 11:40:25 | 显示全部楼层
回复【15楼】玉落彼岸:
---------------------------------
回复【14楼】hechao3225:
---------------------------------
看到了。
回复 支持 反对

使用道具 举报

28

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-1-14
在线时间
3 小时
 楼主| 发表于 2014-1-16 11:44:11 | 显示全部楼层
。回复【14楼】hechao3225:
---------------------------------
使用的为ADC1,我用TIM1的CC1不能触发,改为CC2能够触发
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 13:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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