-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 + 关注
分享到:
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 )


-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
楼主
|
回复于 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;
}
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 )
-
- xiaomiking
-
1147 发帖6357 回复18609 积分
- 私信他 +关注
回复于 2018-06-28
6#
感谢分享,欢迎关注我,资料持续更新中。有需要机械臂,电源,硬件电路设计,软件编程,开发板等各种定制的可以私聊我哦,相互学习,共同进步。
(0 )
发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖