首页 论坛 原厂专区 ST MCU STM32(附例程)分享:PWM触发ADC转换产生EOC中断(触发1次转换1次)

发帖 回复

[原创] STM32(附例程)分享:PWM触发ADC转换产生EOC中断(触发1次转换1次)
2755 查看
8 回复
 楼主 | 发布于 2018-06-06 | 只看楼主
分享到:

STM32例程分享TI的PWM触发ADC转换并产生EOC中断(触发1次转换1次)

游名

//初始化部分:


void ini_ad1(void)
  //ADC GPIO初始化
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA, ENABLE);   //使能ADC和GPIOA时钟  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;         //管脚3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;   //模拟输入模式
  GPIO_Init(GPIOA, &GPIO_InitStructure);     //GPIO组

//TIM1初始化    
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef       TIM_OCInitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
// TIM_DeInit(TIM1);    
TIM_TimeBaseStructure.TIM_Period = 999; //设置1ms一次TIM1比较的周期
TIM_TimeBaseStructure.TIM_Prescaler = 71; //系统主频72M,这里分频71,相当于1000K的定时器2时钟 
TIM_TimeBaseStructure.TIM_ClockDivision=0;         //分频比例
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数方式
//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIM1

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //下面详细说明 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OutputState_Disable; 
TIM_OCInitStructure.TIM_Pulse = 500; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //如果是PWM1要为Low,PWM2则为High 
TIM_OC1Init(TIM1, & TIM_OCInitStructure);  

//ADC初始化
ADC_InitTypeDef           ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立的转换模式 ADC_DUALMOD[3:0]=0000;
  ADC_InitStructure.ADC_ScanConvMode =DISABLE; //关闭扫描模式 因为只有一个通道
  ADC_InitStructure.ADC_ContinuousConvMode =DISABLE; //关闭连续转换模式 否则只要触发一次,
  //后续的转换就会永不停歇(除非CONT清0),这样第一次以后的ADC,就不是由TIM1_CC1来触发了
  ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_CC1;//定时器1触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//对齐方式,ADC为12位中,右对齐方式 ADC_ALIGN=0;
  ADC_InitStructure.ADC_NbrOfChannel = 1; //开启通道数,1个  ADC_SQR1[23:20]=0000;
  //ADC_SQR1[23:20] 设置通道数目的选择
  ADC_Init(ADC1, &ADC_InitStructure);

ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1,ADC_SampleTime_1Cycles5); 
  //ADC_InjectedChannelConfig(ADC1, ADC_Channel_3, 1,ADC_SampleTime_1Cycles5);
ADC_ExternalTrigConvCmd(ADC1, ENABLE); //设置外部触发模式使能(这个“外部“其实仅仅是相//对于ADC模块的外部

  //ADC_DMACmd(ADC1, ENABLE);   
  ADC_Cmd(ADC1, ENABLE);   //ADC命令,使能  ADC_ADON=1
  ADC_ResetCalibration(ADC1);   //重新校准
  while(ADC_GetResetCalibrationStatus(ADC1));   //等待重新校准完成
  ADC_StartCalibration(ADC1);   //开始校准  ADC_RSTCAL=1; 初始化校准寄存器
  while(ADC_GetCalibrationStatus(ADC1));     //等待校准完成  ADC_CAL=0;

//ADC中断初始化 
NVIC_InitTypeDef   NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   //设置NVIC中断分组0
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); //使能ADC中断 

TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE); 
}


本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(1 ) (0 )
回复 举报

楼主 | 回复于 2018-06-06 沙发

//AD中断处理函数
uint16_t U_adc,V_adc; //定义16位U、V相电压数据
 
void ADC1_2_IRQHandler()
{
if(ADC_GetITStatus(ADC1,ADC_IT_EOC) != RESET)
{
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
U_adc = ADC1->DR & 0xffff;
}
else;
}
(0 )
评论 (0) 举报

回复于 2018-06-07 2#

(0 )
评论 (0) 举报

回复于 2018-06-07 3#

(0 )
评论 (0) 举报

回复于 2018-06-11 4#

(0 )
评论 (0) 举报

回复于 2018-06-12 5#

谢谢分享
(0 )
评论 (0) 举报

回复于 2018-06-28 6#

感谢分享,欢迎关注我,资料持续更新中。有需要机械臂,电源,硬件电路设计,软件编程,开发板等各种定制的可以私聊我哦,相互学习,共同进步。
(0 )
评论 (0) 举报

回复于 2018-07-14 7#

多谢分享!!!
(0 )
评论 (0) 举报

回复于 2018-07-20 8#

多谢分享!!!
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部