此代码,是基于stm32精英版,运用l298n电机驱动模块,对直流电机进行调速程序。
1,针对直流电机的不同频率,设定不同的占空比,来实现速度的调节。
2、运用的stm32 的定时器time3 实现pwm的波形输出。
单片机源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "sys.h"
- void Delay(u32 count)
- {
- u32 i=0;
- for(;i<count;i++);
- }
- void NVIC_Configuration(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- }
- /****************************************************************
- * 函数名:void GPIO_Config(void)
- * 描述 :配置复用输出PWM时用到的I/O
- * 输入 :无
- * 输出 :无
- * 调用 :main()调用
- PA6 PA7 两路 PWM
- ***************************************************************/
- void GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* GPIOA and GPIOB clock enable */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); //
-
- /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- /****************************************************************
- * 函数名:void TIM3_Config(void)
- * 描述 :配置TIM3输出的PWM信号的模式
- * CH1:输出 T=2.5ms(f=1/2.5ms=400Hz) 占空比D=0.6的PWM波(高电平在前,低电平在后)
- * CH2:输出 T=2.5ms(f=1/2.5ms=400Hz) D=0.4的PWM波(高电平在后,低电平在前)
- * 步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler (计数值和预分频)
- * T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms
- * 因为 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2 //(预分频 参数)
- * 所以 TIM_Period=59999=0xEA5F //计数值
- * 步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和TIM_OCPolarity
- * CH1:因为D=0.6,先高后低;
- * 所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High
- * CH2:因为D=0.4,先高后低;
- * 所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low
- * 步骤三:基础寄存器初始化
- * 步骤四:通道寄存器初始化
- * 步骤五:使能TIM3重载寄存器ARR
- * 步骤六:使能TIM3
- * 输入 :无
- * 输出 :无
- * 调用 :main()调用
- ***************************************************************/
- void TIM3_Config(void)
- {
- /******************** PWM信号电平跳变值 ***************************/
- //
- // u16 CCR1= 36000; //程序初值
- // u16 CCR2= 36000;
-
- /*******F=500hz的时候 占空比 1 时 *******/ // 注意: 每个F频率对应一个 TIM_Period 。
- // u16 CCR1= 48000;
- // u16 CCR2= 48000; // 直流电机全速转动
- /*******F=500hz的时候 占空比为0.8时 *******/
- // u16 CCR1= 38400;
- // u16 CCR2= 38400;
- /*******F=500hz的时候 占空比为0.7时 *******/
- // u16 CCR1= 33600;
- // u16 CCR2= 33600;
- /*******F=500hz的时候 占空比为0.6时 *******/
- // u16 CCR1= 28800;
- // u16 CCR2= 28800;
- /*******F=500hz的时候 占空比为0.5时 *******/
- // u16 CCR1= 24000;
- // u16 CCR2= 24000;
- /*******F=500hz的时候 占空比为0.4时 *******/
- // u16 CCR1= 19200;
- // u16 CCR2= 19200;
- /*******F=500hz的时候 占空比为0.3时 *******/
- // u16 CCR1= 14400;
- // u16 CCR2= 14400;
-
- /*******F=500hz的时候 占空比为0.2时 *******/
- // u16 CCR1= 9600;
- // u16 CCR2= 9600; //电机运动
- //
- /*******F=500hz的时候 占空比为0.1时 *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; // 电机不动
- /////////////////////////////////////////////////////////////////////////
- /*******F=1Khz的时候 占空比 1 时 *******/
- // u16 CCR1= 24000;
- // u16 CCR2= 24000; // 直流电机全速转动
- /*******F=1Khz的时候 占空比为0.8时 *******/
- u16 CCR1= 19200;
- u16 CCR2= 19200;
- /*******F=1Khz的时候 占空比为0.7时 *******/
- // u16 CCR1= 16800;
- // u16 CCR2= 16800;
- /*******F=1Khz的时候 占空比为0.6时 *******/
- // u16 CCR1= 14400;
- // u16 CCR2= 14400;
- /*******F=1Khz的时候 占空比为0.5时 *******/
- // u16 CCR1= 12000;
- // u16 CCR2= 12000;
- /*******F=1Khz的时候 占空比为0.4时 *******/
- // u16 CCR1= 9600;
- // u16 CCR2= 9600;
- /*******F=1Khz的时候 占空比为0.3时 *******/
- // u16 CCR1= 7200;
- // u16 CCR2= 7200; //电机运动
-
- /*******F=1Khz的时候 占空比为0.2时 *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; //电机起步 yjf
-
- /*******F=1Khz的时候 占空比为0.1时 *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400; // 电机不动
- //* 频率为1k时电机皆为全速运行,无调速,且噪音较大。 */
- /////////////////////////////////////////////////////////////////////////
- /*******F=5Khz的时候 占空比 1 时 *******/
- // u16 CCR1= 4800;
- // u16 CCR2= 4800; // 直流电机全速转动
- /*******F=5Khz的时候 占空比为0.9时 *******/
- // u16 CCR1= 4320;
- // u16 CCR2= 4320;
- /*******F=5Khz的时候 占空比为0.8时 *******/
- // u16 CCR1= 3840;
- // u16 CCR2= 3840;
- /*******F=5Khz的时候 占空比为0.7时 *******/
- // u16 CCR1= 3360;
- // u16 CCR2= 3360;
- /*******F=5Khz的时候 占空比为0.6时 *******/
- // u16 CCR1= 2880;
- // u16 CCR2= 2880;
- /*******F=5Khz的时候 占空比为0.5时 *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400;
- /*******F=5Khz的时候 占空比为0.4时 *******/
- // u16 CCR1= 1920;
- // u16 CCR2= 1920; // 直流电机转动
- /*******F=5Khz的时候 占空比为0.3时 *******/
- // u16 CCR1= 1440;
- // u16 CCR2= 1440; //直流电机起步转动
- //
- /*******F=5Khz的时候 占空比为0.2时 *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960; //直流电机不转动
- //
- /*******F=5Khz的时候 占空比为0.1时 *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; //直流电机不转动
-
- /******************** PWM信号电平跳变值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////
- /*******F=10Khz的时候 占空比 1 时 *******/
- // u16 CCR1= 2400;
- // u16 CCR2= 2400; // 直流电机全速转动
- /*******F=10Khz的时候 占空比为0.8时 *******/
- // u16 CCR1= 1920;
- // u16 CCR2= 1920;
- /*******F=10Khz的时候 占空比为0.7时 *******/
- // u16 CCR1= 1680;
- // u16 CCR2= 1680;
- /*******F=10Khz的时候 占空比为0.6时 *******/
- // u16 CCR1= 1440;
- // u16 CCR2= 1440;
- /*******F=10Khz的时候 占空比为0.5时 *******/
- // u16 CCR1= 1200;
- // u16 CCR2= 1200;
- /*******F=10Khz的时候 占空比为0.4时 *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960; // 直流电机转动
- /*******F=10Khz的时候 占空比为0.3时 *******/
- // u16 CCR1= 720;
- // u16 CCR2= 720; // 直流电机不转
- //
- /*******F=10Khz的时候 占空比为0.2时 *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; //直流电机不转
- /******************** PWM信号电平跳变值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////
- /*******F=15Khz的时候 占空比 1 时 *******/
- // u16 CCR1= 1600;
- // u16 CCR2= 1600; // 直流电机全速转动
- /*******F=15Khz的时候 占空比为0.8时 *******/
- // u16 CCR1= 1280;
- // u16 CCR2= 1280;
- /*******F=15Khz的时候 占空比为0.7时 *******/
- // u16 CCR1= 1120;
- // u16 CCR2= 1120;
- /*******F=15Khz的时候 占空比为0.6时 *******/
- // u16 CCR1= 960;
- // u16 CCR2= 960;
- /*******F=15Khz的时候 占空比为0.5时 *******/
- // u16 CCR1= 800;
- // u16 CCR2= 800;
- /*******F=15Khz的时候 占空比为0.4时 *******/
- // u16 CCR1= 640;
- // u16 CCR2= 640; // 直流电机转动
- /*******F=15Khz的时候 占空比为0.3时 *******/
- // u16 CCR1= 480;
- // u16 CCR2= 480; // 直流电机不转
-
- /*******F=15Khz的时候 占空比为0.2时 *******/
- // u16 CCR1= 320;
- // u16 CCR2= 320; //直流电机不转
- /******************** PWM信号电平跳变值 ***************************/
- ////////////////////////////////////////////////////////////////////////////
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
- /*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
- /* Time base configuration */
- TIM_TimeBaseStructure.TIM_Period =47999; // 计数值 47999
- TIM_TimeBaseStructure.TIM_Prescaler = 2; //设置预分频:预分频=2,即为72/3=24MHz 预分频(时钟分频)72M/(2+1)=24M
-
-
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
- /* PWM1 Mode configuration: Channel1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
-
- TIM_OCInitStructure.TIM_Pulse = CCR1; //设置跳变值,当计数器计数到这个值时,电平发生跳变
- TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //当定时器计数值小于CCR1时为高电平
- TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
- TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
-
- /* PWM1 Mode configuration: Channel2 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = CCR2; //设置通道2的电平跳变值,输出另外一个占空比的PWM
- //TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //当定时器计数值小于CCR2时为低电平
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCr2 时为高电平
- TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能通道2
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
-
- TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3重载寄存器ARR
- /* TIM3 enable counter */
- TIM_Cmd(TIM3, ENABLE); //使能TIM3
- }
- /******************** 定时器参考算法 ***************************/
- //void TIM3_Init(void)
- //{
- // GPIO_InitTypeDef GPIO_InitStructure;
- // TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- // TIM_OCInitTypeDef TIM_OCInitStructure;
- // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB , ENABLE);
- //
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOA, &GPIO_InitStructure);
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOA, &GPIO_InitStructure);
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH3
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOB, &GPIO_InitStructure);
- // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH4
- // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- // GPIO_Init(GPIOB, &GPIO_InitStructure);
- // TIM_TimeBaseStructure.TIM_Period = 59999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
- // TIM_TimeBaseStructure.TIM_Prescaler =2; //设置用来作为TIMx时钟频率除数的预分频值 不分频
- // TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
- // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- // TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
- //
- // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
- // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- // TIM_OCInitStructure.TIM_Pulse = 36000; //设置待装入捕获比较寄存器的脉冲值
- // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- // TIM_OC1Init(TIM3, &TIM_OCInitStructure);
- // TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR1上的预装载寄存器
- // TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
- // TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- // TIM_OCInitStructure.TIM_Pulse = 36000; //设置待装入捕获比较寄存器的脉冲值
- // TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- // TIM_OC2Init(TIM3, &TIM_OCInitStructure);
- // TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
PWM.rar
(280.82 KB, 下载次数: 884)
|