不会的呀! 这个电机控制调速的实验我做过。是不是你把TIME4开了之后忘记开了TIME3了呢?
给你看下我的main函数 和 time里面的函数吧
main()的部分
int main(void)
{
u8 start=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
EXTIX_Init();
LCD_Init();
Timerx_Init(10000,7199);
PWM_Init(900,0); //不分频。PWM频率=72000/900=8Khz
GPIOA->CRH&=0XFFF00FFF;
GPIOA->CRH|=0X00033000;//PA11 推挽输出
GPIOA->ODR|=1<<11; //PA11 输出高
GPIOA->ODR&=~(1<<12); //PA12 输出低
while(1)
{
delay_ms(300);
if(srate>40) //实际转速不大于40
srate-=30;
if(shezhi==1)
{
if(rate>(srate*2))//霍尔元件测得的速度比较
led0pwmval-=5;
if(rate==(srate*2))
{
led0pwmval=led0pwmval;
shezhi=0;
end=1;
}
if(rate<(srate*2))
led0pwmval+=5;
}
if(end!=1)
LCD_ShowNum(60,150,srate,5,16);
LCD_ShowNum(60,180,rate/2,5,16);
if (complete==1)
{
if(end==1)
{
LCD_Fill(60,150,200,1700,WHITE);
LCD_ShowString(60,150,"OK");
LCD_ShowNum(60,180,rate/2,5,16);
}
complete=0;
}
LED0_PWM_VAL1=led0pwmval;
LED0_PWM_VAL2=led0pwmval;
if (start==0)//初始化
{
GPIOA->CRL&=0X00FFFFFF;//PA7输出
GPIOA->CRL|=0X3B000000;//推免输出
GPIOA->ODR&=~(1<<7); //PA6 输出低
start=1;
}
}
time.c部分
定时器
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2;//TIM4时钟使能
TIM4->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM4->  SC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM4->DIER|=1<<0; //允许更新中断
TIM4->DIER|=1<<6; //允许触发中断
TIM4->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占1,子优先级3,组2
}
void PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<1; //TIM3时钟使能
GPIOA->CRH&=0XFFFFFFF0;//PA8输出
GPIOA->CRH|=0X00000004;//浮空输入
GPIOA->CRL&=0X00FFFFFF;//PA7输出
GPIOA->CRL|=0XBB000000;//复用功能输出
GPIOA->ODR|=1<<7;//PA7上拉
GPIOA->ODR|=1<<6;//PA7上拉
TIM3->ARR=arr;//设定计数器自动重装值
TIM3->  SC=psc;//预分频器不分频
TIM3->CCMR1|=7<<12; //CH2 PWM2模式
TIM3->CCMR1|=1<<11; //CH2预装载使能
TIM3->CCMR1|=7<<4; //CH2 PWM2模式
TIM3->CCMR1|=1<<3; //CH2预装载使能
TIM3->CCER|=1<<4; //OC2 输出使能
TIM3->CCER|=1<<0; //OC2 输出使能
TIM3->CR1=0x8000; //ARPE使能
TIM3->CR1|=0x01; //使能定时器3
}
修改速度的只要改led0pwmval就好了,至于GPIOA11和12 不用管这是我用在驱动电路上的
|