9272|24

42

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

PWM驱动电机,电机不转 [复制链接]

 
使用PWM小风扇驱动电机,电机不转。
代码如下:
#include "stm32f10x.h"
#include

void GPIO_PWM_Config(void);
void TIM3_Config(void);
void NVIC_TIM3Config(void);
void COM_Config(void);
void delay(uint32_t nCount);
int fputc(int ch, FILE *f);
int fgetc( FILE *f);

const uint16_t Period_Val = 1000;
__IO uint16_t CCR1_Val = 100,CCR2_Val=900;                          

uint16_t PrescalerValue = 0;
uint16_t  Times=0;

int main(void)
{
   GPIO_PWM_Config();
   TIM3_Config();
   NVIC_TIM3Config();
   COM_Config();

   while(1)
   {
            delay(6000000);
         printf(" %d \n\r", Times++);

   }
}

void GPIO_PWM_Config(void)
{
           GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
    GPIO_Init(GPIOD, &GPIO_InitStructure);       


}


void TIM3_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    // System Clocks Configuration  PCLK1 = HCLK/2 = 36MHz
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);                  // TIM3完全重映射,至PC6、7、8、9

    /*计算预分频系数
    PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;        */

    /* 时基设置 */
    TIM_TimeBaseStructure.TIM_Period = Period_Val;
    TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    /*TIM3为 PWM1模式 , 由Channel1输出 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                 
    TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

        /*TIM3为 PWM1模式 , 由Channel2输出 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                 
    TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC2Init(TIM3, &TIM_OCInitStructure);
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);


    /* TIM IT 使能*/
    TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_CC2 , ENABLE);

    /* TIM3 使能 */
    TIM_Cmd(TIM3, ENABLE);


}

void NVIC_TIM3Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
}

void COM_Config(void)
{

    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

   //  初始化STM32的USART2的TX管脚,配置为复用功能推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

   //  初始化STM32的USART2的RX管脚,配置为复用功能输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

//         使能STM32的USART2的管脚重映射, TX、RX分别映射至PD5、6
    GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);

    USART_InitStructure.USART_BaudRate = 115200;              //串口的波特率,
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据字长度(8位或9位)
    USART_InitStructure.USART_StopBits = USART_StopBits_1;      //可配置的停止位-支持1或2个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;         //无奇偶校验  
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双工模式,使能发送和接收

    USART_Init(USART2, &USART_InitStructure);

        USART_Cmd(USART2, ENABLE);
}

void delay(__IO uint32_t nCount)
{
    for (; nCount != 0; nCount--);
}

#ifndef MicroLIB
//#pragma import(__use_no_semihosting)             //没有实现fgetc时需要声明该参数   
/* 标准库需要的支持函数 使用printf()调试打印不需要实现该函数 */               
struct __FILE
{
        int handle;
    /* Whatever you require here. If the only file you are using is */   
    /* standard output using printf() for debugging, no file handling */   
    /* is required. */
};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
/* 重定义fputc函数 如果使用MicroLIB只需要重定义fputc函数即可 */  
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */

         /* e.g. write a character to the USART */
    USART_SendData(USART2, (uint8_t) ch);

    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
    {}

    return ch;
}
/*
可以直接使用putchar
不需要再定义 int putchar(int ch),因为stdio.h中有如下定义
#define putchar(c) putc(c, stdout)
*/

int ferror(FILE *f) {  
    /* Your implementation of ferror */  
    return EOF;  
}
#endif

FILE __stdin;

int fgetc(FILE *fp)
{
        int ch = 0;
       
    while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)
    {
    }

    ch = (int)USART2->DR & 0xFF;
       
    putchar(ch); //回显
       
        return ch;
}


void TIM3_IRQHandler(void)
{
           if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

        GPIO_SetBits(GPIOD,GPIO_Pin_3);

    }

    if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);

        GPIO_ResetBits(GPIOD,GPIO_Pin_3);
                                                                          
    }
}


无论是接PD3,还是PC6,电机都不转,同样的程序改变CCR_Val可以改变LED灯的亮度,但电机就是不转。
不知道是哪里出问题了,求大神们指教!
此帖出自stm32/stm8论坛

最新回复

任何电子问题100元包解决,解决后付款:+q382635567  详情 回复 发表于 2018-4-3 19:07
点赞 关注
 

回复
举报

2万

帖子

0

TA的资源

超级版主

沙发
 
“无论是接PD3,还是PC6,电机都不转”
难道STM32单片机的I/O口线输出能力已经足以驱动电动机了?
你不妨试试令某条口线始终为“1”或者为“0”(相当于PWM占空比为1或者为0),看看电动机转还是不转。
此帖出自stm32/stm8论坛

点评

我试了下,使PD3置1,发现,电机两端连PD3和3V3电机转动,连PD3和GND电机不转。我理解的是PD3置1,应该与GND连电机转动才对,是我理解错了吗?  详情 回复 发表于 2018-3-24 20:36
 
 

回复

2774

帖子

8

TA的资源

版主

板凳
 
得有硬件连接吧!否则谁知道啥子情况……
此帖出自stm32/stm8论坛
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

4
 
maychang 发表于 2018-3-24 18:44
“无论是接PD3,还是PC6,电机都不转”
难道STM32单片机的I/O口线输出能力已经足以驱动电动机了?
你不妨 ...

我试了下,使PD3置1,发现,电机两端连PD3和3V3电机转动,连PD3和GND电机不转。我理解的是PD3置1,应该与GND连电机转动才对,是我理解错了吗?

IMG_20180324_202717.jpg (2.14 MB, 下载次数: 0)

IMG_20180324_202717.jpg

IMG_20180324_202808.jpg (2.95 MB, 下载次数: 0)

IMG_20180324_202808.jpg
此帖出自stm32/stm8论坛

点评

“我理解的是PD3置1,应该与GND连电机转动才对,是我理解错了吗?” 我也这么理解。 不知道为什么“电机两端连PD3和3V3电机转动,连PD3和GND电机不转”。  详情 回复 发表于 2018-3-24 21:15
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

5
 
shrxh 发表于 2018-3-24 20:36
我试了下,使PD3置1,发现,电机两端连PD3和3V3电机转动,连PD3和GND电机不转。我理解的是PD3置1,应该与 ...

“我理解的是PD3置1,应该与GND连电机转动才对,是我理解错了吗?”
我也这么理解。
不知道为什么“电机两端连PD3和3V3电机转动,连PD3和GND电机不转”。
此帖出自stm32/stm8论坛
 
 
 

回复

1万

帖子

142

TA的资源

版主

6
 
楼主应给出相关局部电路才好判断。
此帖出自stm32/stm8论坛

点评

IO口驱动电路,由NPN三极管实现,这样可以吗? 如果把电机接在集电极和VCC之间可以吗?  详情 回复 发表于 2018-3-26 16:03
[attachimg]348204[/attachimg]我连了两个电机,一个电机连PD3和GND,一个连PC6和GND,两个电机都不转; 如果连PD3和3V3,电机转,并且改变占空比可以调速; 连PC6和3V3,电机也不转。 是不是这个板子3V3和GND搞混  详情 回复 发表于 2018-3-25 10:27
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

7
 
chunyang 发表于 2018-3-24 23:54
楼主应给出相关局部电路才好判断。

我连了两个电机,一个电机连PD3和GND,一个连PC6和GND,两个电机都不转;
如果连PD3和3V3,电机转,并且改变占空比可以调速;
连PC6和3V3,电机也不转。
是不是这个板子3V3和GND搞混了?
此帖出自stm32/stm8论坛

点评

没有电路图,不好判断。  详情 回复 发表于 2018-3-25 16:12
 
 
 

回复

1万

帖子

142

TA的资源

版主

8
 
shrxh 发表于 2018-3-25 10:27
我连了两个电机,一个电机连PD3和GND,一个连PC6和GND,两个电机都不转;
如果连PD3和3V3,电机转,并且 ...

没有电路图,不好判断。
此帖出自stm32/stm8论坛

点评

您是指IO口的电路图吗?  详情 回复 发表于 2018-3-26 09:39
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

4005

帖子

0

TA的资源

版主

9
 
io口直接驱动不行的
此帖出自stm32/stm8论坛

点评

请问,为什么不行呢?  详情 回复 发表于 2018-3-26 09:40
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

10
 
chunyang 发表于 2018-3-25 16:12
没有电路图,不好判断。

您是指IO口的电路图吗?
此帖出自stm32/stm8论坛

点评

所有相关的,还包括负载、你的接线等。  详情 回复 发表于 2018-3-26 16:41
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

11
 
huo_hu 发表于 2018-3-25 21:00
io口直接驱动不行的

请问,为什么不行呢?
此帖出自stm32/stm8论坛

点评

IO口的电流能力应该是只有20MA左右吧?这点电流能力怎么能带动电机?加个三极管吧至少。加强驱动。  详情 回复 发表于 2018-3-26 09:58
IO口的电流能力应该是只有20MA左右吧?这点电流能力怎么能带动电机?加个三极管吧至少。加强驱动。  详情 回复 发表于 2018-3-26 09:58
 
 
 

回复

943

帖子

3

TA的资源

纯净的硅(中级)

12
 
shrxh 发表于 2018-3-26 09:40
请问,为什么不行呢?

IO口的电流能力应该是只有20MA左右吧?这点电流能力怎么能带动电机?加个三极管吧至少。加强驱动。
此帖出自stm32/stm8论坛

点评

我用的电机是小风扇上的电机,很小的,电机两端连接板子上3V3和GND电机可以转动。 当IO口置1时,输出的电压也是3.3V对吧?为什么驱动不了呢?  详情 回复 发表于 2018-3-26 10:01
 
 
 

回复

943

帖子

3

TA的资源

纯净的硅(中级)

13
 
shrxh 发表于 2018-3-26 09:40
请问,为什么不行呢?

IO口的电流能力应该是只有20MA左右吧?这点电流能力怎么能带动电机?加个三极管吧至少。加强驱动。
此帖出自stm32/stm8论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

14
 
雨后的梧桐 发表于 2018-3-26 09:58
IO口的电流能力应该是只有20MA左右吧?这点电流能力怎么能带动电机?加个三极管吧至少。加强驱动。

我用的电机是小风扇上的电机,很小的,电机两端连接板子上3V3和GND电机可以转动。
当IO口置1时,输出的电压也是3.3V对吧?为什么驱动不了呢?
此帖出自stm32/stm8论坛

点评

你可以测一下这个电机的电流3.3V到底是多少。  详情 回复 发表于 2018-3-26 10:07
 
 
 

回复

943

帖子

3

TA的资源

纯净的硅(中级)

15
 
shrxh 发表于 2018-3-26 10:01
我用的电机是小风扇上的电机,很小的,电机两端连接板子上3V3和GND电机可以转动。
当IO口置1时,输出的 ...

你可以测一下这个电机的电流3.3V到底是多少。
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

11

TA的资源

五彩晶圆(高级)

16
 
3v3 给电机供电能工作。串联个电流表测一下电流。很容易达到百毫安。单片机io 不是驱动电机用的。   可以用io连接NPN三极管,再连电机。买个电机驱动模块也可以。
此帖出自stm32/stm8论坛

点评

这个样子啊,蟹蟹。 如果我想用单片机输出PWM波形控制电机转速,也需要在波形输出IO口连接NPN三极管,再连电机。对吗?  详情 回复 发表于 2018-3-26 13:42
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

17
 
ienglgge 发表于 2018-3-26 13:07
3v3 给电机供电能工作。串联个电流表测一下电流。很容易达到百毫安。单片机io 不是驱动电机用的。   可以用 ...

这个样子啊,蟹蟹。
如果我想用单片机输出PWM波形控制电机转速,也需要在波形输出IO口连接NPN三极管,再连电机。对吗?
此帖出自stm32/stm8论坛

点评

是的,这种小电机,一般的三极管应该就能驱动。要是更大功率的电机,就得考虑管子的驱动能力了。  详情 回复 发表于 2018-3-27 17:38
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

18
 
chunyang 发表于 2018-3-24 23:54
楼主应给出相关局部电路才好判断。

IO口驱动电路,由NPN三极管实现,这样可以吗?
如果把电机接在集电极和VCC之间可以吗?

QQ图片20180326155806.jpg (222.54 KB, 下载次数: 0)

QQ图片20180326155806.jpg
此帖出自stm32/stm8论坛

点评

电路错误,不能用射随器。为什么?建议你想想射随器的特性。  详情 回复 发表于 2018-3-26 16:42
 
 
 

回复

1万

帖子

142

TA的资源

版主

19
 
shrxh 发表于 2018-3-26 09:39
您是指IO口的电路图吗?

所有相关的,还包括负载、你的接线等。
此帖出自stm32/stm8论坛
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

回复

1万

帖子

142

TA的资源

版主

20
 
shrxh 发表于 2018-3-26 16:03
IO口驱动电路,由NPN三极管实现,这样可以吗?
如果把电机接在集电极和VCC之间可以吗?

电路错误,不能用射随器。为什么?建议你想想射随器的特性。
此帖出自stm32/stm8论坛

点评

是因为射随器的电压放大倍数小于1,您认为电压太低带不动电机吗? 我的电机很小,3V就足够了。电流经过放大也能满足要求。 还是因为其他错误原因?  详情 回复 发表于 2018-3-26 17:22
 
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表