主程序 #include "public.h" #include "printf.h" #include "adc.h" #include "systick.h" #include "public.h" #include "pwm.h" #include "systick.h" /**************************************************************************** * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None ****************************************************************************/ int main() { u32 ti1=5; u32 ti2=5; u32 ad1=0; u32 ad2=0; u32 ad3=0; u32 ad4=0; u32 m1,m2; u8 i; pwm1_init(); //PWM1 初始化 pwm2_init(); //PWM2 初始化 adc1_init(); //ADC1 初始化 adc2_init(); //ADC2 初始化 adc3_init(); //ADC3 初始化 adc4_init(); //ADC4 初始化 printf_init(); //printf 初始化 while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_0); ad1=0; for(i=0;i<50;i++)//讀取 50 次的 AD 數(shù)值取其平均數(shù)較為準確
{ ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//轉(zhuǎn)換結(jié)束標志位 ad1=ad1+ADC_GetConversionValue(ADC1);//返回最近一次 ADCx 規(guī)則組的轉(zhuǎn) 換結(jié)果 } ad1=ad1/50; printf("ad1=%f\n",ad1*3.3/4096); // GPIO_ResetBits(GPIOA,GPIO_Pin_0); delay_ms(1000); GPIO_ResetBits(GPIOA,GPIO_Pin_0); ad2=0; for(i=0;i<50;i++)//讀取 50 次的 AD 數(shù)值取其平均數(shù)較為準確 { ADC_RegularChannelConfig(ADC2,ADC_Channel_1,1,ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC2, ENABLE); while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC));//轉(zhuǎn)換結(jié)束標志位 ad2=ad2+ADC_GetConversionValue(ADC2);//返回最近一次 ADCx 規(guī)則組的轉(zhuǎn)
換結(jié)果 } ad2=ad2/50; printf("ad2=%f\n",ad2*3.3/4096); delay_ms(1000); ad3=0; for(i=0;i<50;i++)//讀取 50 次的 AD 數(shù)值取其平均數(shù)較為準確 {
ADC_RegularChannelConfig(ADC3,ADC_Channel_13,1,ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC3, ENABLE); while(!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC));//轉(zhuǎn)換結(jié)束標志位 ad3=ad3+ADC_GetConversionValue (ADC3);//返回最近一次 ADCx 規(guī)則組的轉(zhuǎn)
換結(jié)果 } ad3=ad3/50; printf("ad3=%f\n",ad3*3.3/4096);
// GPIO_ResetBits(GPIOC,GPIO_Pin_3); delay_ms(1000); GPIO_SetBits(GPIOC,GPIO_Pin_3); ad4=0; for(i=0;i<50;i++)//讀取 50 次的 AD 數(shù)值取其平均數(shù)較為準確 { ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//轉(zhuǎn)換結(jié)束標志位 ad4=ad4+ADC_GetConversionValue (ADC1);//返回最近一次 ADCx 規(guī)則組的轉(zhuǎn)
換結(jié)果 } ad4=ad4/50; printf("ad4=%f\n",ad4*3.3/4096); delay_ms(1000); GPIO_ResetBits(GPIOA,GPIO_Pin_3); if (ad1>ad3) {
m1=ad1-ad3; if (m1>100) {
} else GPIO_ResetBits(GPIOC,GPIO_Pin_4); //PC4,使能端 GPIO_SetBits(GPIOC,GPIO_Pin_5); //PC5,CW 方向了控制 TIM_SetCompare2(TIM2, ti2);//設(shè)置 TIMx 捕獲比較 2 寄存器值
GPIO_SetBits(GPIOC,GPIO_Pin_4); //PC4,使能端 } else if (ad1<ad3) { m1=ad3-ad1; if (m1>100) { GPIO_ResetBits(GPIOC,GPIO_Pin_4); //PC4,使能端
GPIO_ResetBits(GPIOC,GPIO_Pin_5); //PC5,CW 方向了控 制 TIM_SetCompare2(TIM2, ti2);//設(shè)置 TIMx 捕獲比較 2 寄存器值
} else } else GPIO_SetBits(GPIOC,GPIO_Pin_4); //PC4,使能端
GPIO_SetBits(GPIOC,GPIO_Pin_4); //PC4,使能端 if (ad2>ad4) { m2=ad2-ad4; if (m2>500) {
} else GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_SetBits(GPIOC,GPIO_Pin_0); TIM_SetCompare2(TIM3, ti1);//設(shè)置 TIMx 捕獲比較 2 寄存器值
GPIO_SetBits(GPIOC,GPIO_Pin_1); //PC1,使能端 m2 } else if (ad2<ad4) { m2=ad4-ad2; if (m2>500) { GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_ResetBits(GPIOC,GPIO_Pin_0); TIM_SetCompare2(TIM3, ti1);//設(shè)置 TIMx 捕獲比較 2 寄存器值
else } else GPIO_SetBits(GPIOC,GPIO_Pin_1); //PC1,使能端 m2 }
GPIO_SetBits(GPIOC,GPIO_Pin_1); //PC1,使能端 m2 } }
/* //M2 縱軸 { GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_SetBits(GPIOC,GPIO_Pin_0); TIM_SetCompare2(TIM3, ti1);//設(shè)置 TIMx 捕獲比較 2 寄存器值 while(1); } */ /* //M1 橫軸 { GPIO_ResetBits(GPIOC,GPIO_Pin_4); GPIO_SetBits(GPIOC,GPIO_Pin_5); TIM_SetCompare2(TIM2, ti2);//設(shè)置 TIMx 捕獲比較 2 寄存器值 //while(1); } } } */ /** // GPIO_ResetBits(GPIOC,GPIO_Pin_1); // GPIO_SetBits(GPIOC,GPIO_Pin_0); // TIM_SetCompare2(TIM3, ti1);//設(shè)置 TIMx 捕獲比較 2 寄存器值 // while(1); // GPIO_ResetBits(GPIOC,GPIO_Pin_4); // GPIO_SetBits(GPIOC,GPIO_Pin_5); // TIM_SetCompare2(TIM2, ti2);//設(shè)置 TIMx 捕獲比較 2 寄存器值 // while(1); */ ADC 程序 #include "adc.h" void adc1_init() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_ APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//ADC GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模擬輸入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); //設(shè)置指定 ADC 的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間 ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校準寄存器 while(ADC_GetResetCalibrationStatus(ADC1));//獲取 ADC 重置校準寄存器的狀態(tài) ADC_StartCalibration(ADC1);//開始指定 ADC 的校準狀態(tài) while(ADC_GetCalibrationStatus(ADC1));//獲取指定 ADC 的校準程序 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的 ADC 的軟件轉(zhuǎn) 換啟動功能 } void adc2_init() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_ APB2Periph_ADC2,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模擬輸入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC2, &ADC_InitStructure); //設(shè)置指定 ADC 的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間 ADC_RegularChannelConfig(ADC2,ADC_Channel_1,1,ADC_SampleTime_239Cycles5); ADC_Cmd(ADC2,ENABLE); ADC_ResetCalibration(ADC2);//重置指定的 ADC 的校準寄存器 while(ADC_GetResetCalibrationStatus(ADC2));//獲取 ADC 重置校準寄存器的狀態(tài) ADC_StartCalibration(ADC2);//開始指定 ADC 的校準狀態(tài) while(ADC_GetCalibrationStatus(ADC2));//獲取指定 ADC 的校準程序 ADC_SoftwareStartConvCmd(ADC2, ENABLE);//使能或者失能指定的 ADC 的軟件轉(zhuǎn) 換啟動功能 } void adc3_init() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO|RCC_ APB2Periph_ADC3,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//ADC GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模擬輸入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC3, &ADC_InitStructure); //設(shè)置指定 ADC 的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間 ADC_RegularChannelConfig(ADC3,ADC_Channel_13,1,ADC_SampleTime_239Cycles5) ; ADC_Cmd(ADC3,ENABLE); ADC_ResetCalibration(ADC3);//重置指定的 ADC 的校準寄存器 while(ADC_GetResetCalibrationStatus(ADC3));//獲取 ADC 重置校準寄存器的狀態(tài) ADC_StartCalibration(ADC3);//開始指定 ADC 的校準狀態(tài) while(ADC_GetCalibrationStatus(ADC3));//獲取指定 ADC 的校準程序 ADC_SoftwareStartConvCmd(ADC3, ENABLE);//使能或者失能指定的 ADC 的軟件轉(zhuǎn) 換啟動功能 } void adc4_init() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_ APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//ADC GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模擬輸入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //獨立模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //掃描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //連續(xù)轉(zhuǎn)換模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); //設(shè)置指定 ADC 的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時間 ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校準寄存器 while(ADC_GetResetCalibrationStatus(ADC1));//獲取 ADC 重置校準寄存器的狀態(tài) ADC_StartCalibration(ADC1);//開始指定 ADC 的校準狀態(tài) while(ADC_GetCalibrationStatus(ADC1));//獲取指定 ADC 的校準程序 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的 ADC 的軟件轉(zhuǎn) 換啟動功能 } PWM 程序 #include "pwm.h" void pwm1_init() { GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結(jié)構(gòu)體變量,用來初始化 GPIO TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//聲明一個結(jié)構(gòu)體變量,用來初 始化定時器
化外設(shè) TIMx /* 開啟時鐘 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ //TIM3 定時器初始化 TIM_TimeBaseInitStructure.TIM_Period = 9000; // 不 分 頻 ,PWM 頻 率 =72000/900=8Khz//設(shè)置自動重裝載寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 0;//設(shè)置用來作為 TIMx 時鐘頻率預分頻值, 100Khz 計數(shù)頻率
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//設(shè)置時鐘分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上 計數(shù)模式 TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);// 改 變 指 定 管 腳 的 映 射 //pC7 //PWM 初始化 //根據(jù) TIM_OCInitStruct 中指定的參數(shù)初始化外設(shè) TIMx TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM 輸出使能 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OC2Init(TIM3,&TIM_OCInitStructure); //注意此處初始化時 TIM_OC2Init 而不是 TIM_OCInit,否則會出錯。因為固件庫的版 本不一樣。 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能 TIMx 在 CCR2 上的預裝載寄存器 TIM_Cmd(TIM3,ENABLE);//使能或者失能 TIMx 外設(shè) } void pwm2_init() { GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結(jié)構(gòu)體變量,用來初始化 GPIO TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//聲明一個結(jié)構(gòu)體變量,用來初 始化定時器 TIM_OCInitTypeDef TIM_OCInitStructure;//根據(jù) TIM_OCInitStruct 中指定的參數(shù)初始 化外設(shè) TIMx /* 開啟時鐘 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出
GPIO_Init(GPIOB,&GPIO_InitStructure); /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ /* 配置 GPIO 的模式和 IO 口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; //選擇你要設(shè)置的 IO 口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //設(shè)置推挽輸出模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //設(shè)置傳輸速率 GPIO_Init(GPIOC,&GPIO_InitStructure); /* 初始化 GPIO */ //TIM3 定時器初始化 TIM_TimeBaseInitStructure.TIM_Period = 9000; // 不 分 頻 ,PWM 頻 率 =72000/900=8Khz//設(shè)置自動重裝載寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 0;//設(shè)置用來作為 TIMx 時鐘頻率預分頻值, 100Khz 計數(shù)頻率 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//設(shè)置時鐘分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上 計數(shù)模式 TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);// 改 變 指 定 管 腳 的 映 射 //pC7 //PWM 初始化 //根據(jù) TIM_OCInitStruct 中指定的參數(shù)初始化外設(shè) TIMx TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM 輸出使能 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OC2Init(TIM2,&TIM_OCInitStructure); //注意此處初始化時 TIM_OC2Init 而不是 TIM_OCInit,否則會出錯。因為固件庫的版 本不一樣。
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能 TIMx 在 CCR2 上的預裝載寄存器 TIM_Cmd(TIM2,ENABLE);//使能或者失能 TIMx 外設(shè) }
|