本帖最后由 『GENT』 于 2019-4-26 16:10 编辑
小弟要通过两个ADC数据,来控制PWM的频率;通过两个中断,来控制PWM的停止。
主函数
[mw_shl_code=c,true] int main(void)
{
double PRE1;
double PRE2;
double PRE;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
Adc_Init();
EXTIX_Init();
TIM3->CCR2=0;
while(1)
{
PRE1= Get_Adc_Average(0,4);
PRE2= Get_Adc_Average(1,4);
PRE= PRE2- PRE1;
control(PRE);
}
} [/mw_shl_code]
函数control
[mw_shl_code=c,true]void control(double PRE)
{
u8 PSC=71;
if(0.72<=PRE<1.35)
{
switch(TIM3->CCR2)
{
case 0:
{
GPIO_SetBits(GPIOE, GPIO_Pin_5);
TIM3_PWM_Init(3999,PSC);
TIM_SetCompare2(TIM3,10);
while(TIM3->ARR> 599)
{
TIM3->ARR-=10;
}
}break;
case 10:
{
u8 DIR= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
if(DIR==0)
{
TIM3->ARR+=10;
}
if(DIR==1)
{
TIM3->ARR-=10;
}
}break;
}
}
if(-1.35<PRE<0.72)
{
switch(TIM3->CCR2)
{
case 0:
{
GPIO_ResetBits(GPIOE, GPIO_Pin_5);
TIM3_PWM_Init(3999,PSC);
TIM_SetCompare2(TIM3,10);
while(TIM3->ARR> 599)
{
TIM3->ARR-=10;
}
}break;
case 10:
{
u8 DIR= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
if(DIR==0)
{
TIM3->ARR-=10;
}
if(DIR==1)
{
TIM3->ARR+=10;
}
}break;
}
}
}[/mw_shl_code]
其中一个中断服务函数
[mw_shl_code=c,true]void EXTI1_IRQHandler(void)
{
delay_ms(10);
if(PEin(1)==0)
{
while(TIM3->ARR< 3999)
{
TIM3->ARR=TIM3->ARR+10;
}
TIM_SetCompare2(TIM3,0);
GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
EXTI_ClearITPendingBit(EXTI_Line1);
}[/mw_shl_code]
ADC的配置
[mw_shl_code=c,true] ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)); [/mw_shl_code]
未操作时,PRE的值大概为0.6,也就是在control函数条件范围外,但PB5对应的灯还是亮了,也就是PWM开启了,而且中断也没有反应(PE5对应的灯没反应)。中断配置应该没有问题,在其他project里试过了。改变ADC输入也没有反应。。求各位大佬帮忙看一下哪里出问题了?用的是stm32f103zet6
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>