声明 个人学习内容 仅供参考
STM32f103c8t6最小系统 摇杆电位器 无刷电机 电调
PWM初始化函数
void pwm_init()
{
GPIO_InitTypeDef GPIO_InitStructure; //ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯GPIO
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//ÉùÃ÷Ò»¸ö½á¹¹Ìå±äÁ¿£¬ÓÃÀ´³õʼ»¯¶¨Ê±Æ÷
TIM_OCInitTypeDef TIM_OCInitStructure;//¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
/* ¿ªÆôʱÖÓ */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,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(GPIOA,&GPIO_InitStructure);
//TIM3¶¨Ê±Æ÷³õʼ»¯
TIM_TimeBaseInitStructure.TIM_Period = 1439; //²»·ÖƵ,PWM ƵÂÊ=72000/900=8Khz//ÉèÖÃ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ 5Khz
TIM_TimeBaseInitStructure.TIM_Prescaler = 99;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂÊÔ¤·ÖƵֵ£¬100Khz¼ÆÊýƵÂÊ
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down; //TIMÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//¸Ä±äÖ¸¶¨¹Ü½ÅµÄÓ³Éä //pC7
//PWM³õʼ»¯ //¸ù¾ÝTIM_OCInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIMx
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWMÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
//×¢Òâ´Ë´¦³õʼ»¯Ê±TIM_OC2Init¶ø²»ÊÇTIM_OCInit£¬·ñÔò»á³ö´í¡£ÒòΪ¹Ì¼þ¿âµÄ°æ±¾²»Ò»Ñù¡£
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//ʹÄÜ»òÕßʧÄÜTIMxÔÚCCR2ÉϵÄÔ¤×°ÔØ¼Ä´æÆ÷
TIM_Cmd(TIM3,ENABLE);//ʹÄÜ»òÕßʧÄÜTIMxÍâÉè
}
得到 500HZ pwm信号
ADC初始化
void adc_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M ×î´ó14M ÉèÖÃADCʱÖÓ£¨ADCCLK£©
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 = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬ÉèÖÃËüÃǵÄת»¯Ë³ÐòºÍ²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//ÖØÖÃÖ¸¶¨µÄADCµÄУ׼¼Ä´æÆ÷
while(ADC_GetResetCalibrationStatus(ADC1));//»ñÈ¡ADCÖØÖÃУ׼¼Ä´æÆ÷µÄ״̬
ADC_StartCalibration(ADC1);//¿ªÊ¼Ö¸¶¨ADCµÄУ׼״̬
while(ADC_GetCalibrationStatus(ADC1));//»ñȡָ¶¨ADCµÄУ׼³ÌÐò
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ʹÄÜ»òÕßʧÄÜÖ¸¶¨µÄADCµÄÈí¼þת»»Æô¶¯¹¦ÄÜ
}
主函数
#include "stm32f10x.h"
#include "adc.h"
#include "pwm.h"
int main(void)
{
u32 ad=0;
u8 i;
adc_init(); //ADC³õʼ»¯
pwm_init();
// printf_init(); //printf³õʼ»¯
while(1)
{
ad=0;
for(i=0;i<50;i++)//¶ÁÈ¡50´ÎµÄADÊýֵȡÆäƽ¾ùÊý½ÏΪ׼ȷ
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//ת»»½áÊø±ê־λ
ad=ad+ADC_GetConversionValue(ADC1);//·µ»Ø×î½üÒ»´ÎADCx¹æÔò×éµÄת»»½á¹û
}
ad=ad/50;
TIM_SetCompare2(TIM3, ad*1439/4096);
// printf("ad=%fV\n",ad*3.3/4096);
// delay_ms(1000);
}
}
注意 电调首次使用需设置量程