OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3671|回复: 4

做两轮自平衡车PWM配置完后仿真时无PWM波形输出

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-3-18
在线时间
7 小时
发表于 2016-8-22 20:45:23 | 显示全部楼层 |阅读模式
1金钱
写了一个两轮自平衡车电机驱动代码,但仿真运行时两个PWM 都没有输出,看了很长时间也不知道为什么,希望高手帮忙看看 谢谢拉
主函数:main.c
#include "stm32f10x.h"
#include "MotorDriver.h"
int main(void)
{
        MotorDriver_Init();
        while(1);
}

电机驱动函数:MotorDriver.c
PC0-3控制左右轮的正反转,PC6-TIM8_CH1  PC7_TIM8_CH2输出PWM波

#include "stm32f10x.h"
//#include "GlobalVars.h"
#include "MotorDriver.h"

//左轮:PC0、PC1                        右轮:PC2、PC3
#define        MOTOR_L_IN1_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_0))
#define        MOTOR_L_IN1_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_0))
#define        MOTOR_L_IN2_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_1))
#define        MOTOR_L_IN2_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_1))

#define        MOTOR_R_IN1_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_2))
#define        MOTOR_R_IN1_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_2))
#define        MOTOR_R_IN2_LOW                        (GPIO_ResetBits(GPIOC, GPIO_Pin_3))
#define        MOTOR_R_IN2_HIGH                (GPIO_SetBits(GPIOC, GPIO_Pin_3))

//电机驱动左轮配置
void MotorDriver_L_Config(void)
{
        GPIO_InitTypeDef                                        GPIO_InitStructure ;
        TIM_TimeBaseInitTypeDef                TIM_BaseInitStructure;
        TIM_OCInitTypeDef                                        TIM_OCInitStructure;
       
        //使能GPIOC、AFIO、TIM8时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM8,ENABLE);
       
        //PC0、PC1初始化
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        //PC6初始化为AF_PP模式(TIM8_CH1)
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        //TIM8_CH1配置
        TIM_BaseInitStructure.TIM_Prescaler=3-1;                                //时钟预分频数3,TIM8的计数时钟频率为24MHz
        TIM_BaseInitStructure.TIM_Period=1000-1;                                //自动重装载寄存器数值,PWM2频率为24MHz/1000=24KHz
        TIM_BaseInitStructure.TIM_ClockDivision=0;                        //采样分频
        TIM_BaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
        TIM_BaseInitStructure.TIM_RepetitionCounter=0;        //重复计数器
        TIM_TimeBaseInit(TIM8,&TIM_BaseInitStructure);
       
        TIM_OCStructInit(&TIM_OCInitStructure);                                        //把TIM_OCInitStruct 中的每一个参数按缺省值填入
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //PWM1输出模式
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性
        TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Enable;//使能该通道
        TIM_OC1Init(TIM8,&TIM_OCInitStructure);                                                                                        //按指定参数初始化
       
        TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);                //使能TIM8在CCR1上的预装载寄存器
        TIM_ARRPreloadConfig(TIM8, ENABLE);                                                                        //使能TIM8在ARR上的预装载寄存器
       
        TIM_Cmd(TIM8, ENABLE);                                                                                                                        //打开TIM8
        TIM_CtrlPWMOutputs(TIM8, ENABLE);                                                                                //PWM输出使能
}

//电机驱动右轮配置
void MotorDriver_R_Config(void)
{
        GPIO_InitTypeDef                                        GPIO_InitStructure ;
        TIM_TimeBaseInitTypeDef                TIM_BaseInitStructure;
        TIM_OCInitTypeDef                                        TIM_OCInitStructure;
       
        //使能GPIOC、AFIO、TIM8时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM8,ENABLE);
       
        //PC2、PC3初始化
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        //PC7初始化为AF_PP模式(TIM8_CH2)
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        //TIM8_CH2配置
        TIM_BaseInitStructure.TIM_Prescaler=3-1;                                //时钟预分频数3,TIM8的计数时钟频率为24MHz
        TIM_BaseInitStructure.TIM_Period=1000-1;                                //自动重装载寄存器数值,PWM2频率为24MHz/1000=24KHz
        TIM_BaseInitStructure.TIM_ClockDivision=0;                        //采样分频
        TIM_BaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
        TIM_BaseInitStructure.TIM_RepetitionCounter=0;        //重复计数器
        TIM_TimeBaseInit(TIM8,&TIM_BaseInitStructure);
       
        TIM_OCStructInit(&TIM_OCInitStructure);                                        //把TIM_OCInitStruct 中的每一个参数按缺省值填入
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //PWM1输出模式
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性
        TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Enable;//使能该通道
        TIM_OC2Init(TIM8,&TIM_OCInitStructure);                                                                                        //按指定参数初始化
       
        TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);                //使能TIM8在CCR2上的预装载寄存器
        TIM_ARRPreloadConfig(TIM8, ENABLE);                                                                        //使能TIM8在ARR上的预装载寄存器
       
        TIM_Cmd(TIM8, ENABLE);                                                                                                                        //打开TIM8
        TIM_CtrlPWMOutputs(TIM8, ENABLE);                                                                                //PWM输出使能
}



//左轮电机正转
void        MotorDriver_L_Turn_Forward(void)
{
        MOTOR_L_IN1_LOW;
        MOTOR_L_IN2_HIGH;
}

//左轮电机反转
void        MotorDriver_L_Turn_Reverse(void)
{
        MOTOR_L_IN1_HIGH;
        MOTOR_L_IN2_LOW;
}

//右轮电机正转
void        MotorDriver_R_Turn_Forward(void)
{
        MOTOR_R_IN1_LOW;
        MOTOR_R_IN2_HIGH;
}

//右轮电机反转
void        MotorDriver_R_Turn_Reverse(void)
{
        MOTOR_R_IN1_HIGH;
        MOTOR_R_IN2_LOW;
}

//电机驱动外设初始化
void        MotorDriver_Init(void)                                                               
{
        MotorDriver_L_Config();
        MotorDriver_R_Config();
       
        MotorDriver_L_Turn_Forward();
        MotorDriver_R_Turn_Forward();
}

驱动头文件:MotorDriver.h
#ifndef _MOTORDRIVER_H_
#define _MOTORDRIVER_H_

void MotorDriver_L_Config(void);
void MotorDriver_R_Config(void);
void        MotorDriver_L_Turn_Forward(void);                        //左轮电机正转
void        MotorDriver_L_Turn_Reverse(void);                        //左轮电机反转
void        MotorDriver_R_Turn_Forward(void);                        //右轮电机正转
void        MotorDriver_R_Turn_Reverse(void);                        //右轮电机反转
void        MotorDriver_Init(void);                                                                //电机驱动外设初始化

#endif

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-8-22 21:45:36 | 显示全部楼层
是不是没勾选实时更新的选项
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-3-18
在线时间
7 小时
 楼主| 发表于 2016-8-22 23:07:47 | 显示全部楼层
Da Wen 发表于 2016-8-22 21:45
是不是没勾选实时更新的选项

什么地方的实时更新?
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-8-23 13:44:24 | 显示全部楼层
9SG(2(%{G$GH7UP%O2R`A.png 6_)SM~99O57BHR{AE)XHE6O.png

这两个地方看看你设置对不对
回复

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-3-18
在线时间
7 小时
 楼主| 发表于 2016-8-23 19:07:43 | 显示全部楼层
本帖最后由 lengxiaohua 于 2016-8-23 19:09 编辑
Da Wen 发表于 2016-8-23 13:44
这两个地方看看你设置对不对

设置都对的,感觉还是代码配置有问题,PWM输出一直都是低电平
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表