以下为《单片机课设-直流电机控制》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
/
/
void PWM_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//开启TIM和相应端口时钟
//启动GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,
ENABLE);
//启动AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//启动TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
//GPIO做相应设置,为AF输出 //PA8,PB13一组互补输出 A9,PB14一组互补输出
//PA.8/9口设置为TIM1的OC1输出口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB.13/14口设置为TIM1_CH1N和TIM1_CH2N输出口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9);
GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM1基本计数器设置(设置PWM频率)10KHz
TIM_BaseInitStructure.TIM_Period = 100-1; //10khz 好计算。按照1%的精确度,理论最大72000/100 = 720KHz
TIM_BaseInitStructure.TIM_Prescaler = 72-1;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_BaseInitStructure.TIM_RepetitionCounter 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 aticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
//TIM1_OC通道输出PWM
TIM_CtrlPWMOutputs(TIM1, ENABLE);
//TIM1开启
TIM_Cmd(TIM1, ENABLE);
}
int main(void)
{
static u8 motorValue = 50,oldvalue = 50;
static u8 startStop = 1,dir = 1;//startStop = 1启动 =0停止 dir =1 正转
volatile u8 key = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init();
KEY_Init();
delay_init();
PWM_Configuration();
Motor_IO_Init();
LED1 = LED_ON;
while(1)
{
key = KEY_Scan(0);
if(key)
{
switch(key)
{
case KEY1_PRES:
startStop = !startStop;
break;
case KEY2_PRES:
dir = !dir;
break;
case KEY3_PRES:
motorValue += 5;
break;
case KEY4_PRES:
motorValue -= 5;
break;
default:
break;
}
if(motorValue>249)//94)
motorValue = 94;
if (startStop)
{
if(dir)
{
TIM_SetCompare2(TIM1,0);
delay_ms(500);
TIM_SetCompare1(TIM1,motorValue);
}
else
{
TIM_SetCompare1(TIM1,0);
delay_ms(500);
TIM_SetCompare2(TIM1,motorValue);
}
}
else
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0);
}
}
}
}
//S1 启动&停止 S2翻转 S3+5 S4-5
[文章尾部最后300字内容到此结束,中间部分内容请查看底下的图片预览]
以上为《单片机课设-直流电机控制》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。