OpenEdv-开源电子网

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

发现一个问题,希望有大佬可以帮我解答下

[复制链接]

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2018-3-18
在线时间
29 小时
发表于 2018-8-26 17:10:53 | 显示全部楼层 |阅读模式
20金钱
今天在写电机驱动程序的时候,需要拉低和拉高引脚电平的操作。发现一个问题,如果我把SetBits()函数写进一个while(1)循环我用万用表测不到电压只有0.1-0.2的电压。然后我又试了试GPIO_Write()函数,和上面的现象一样。


如下是配置函数:
void Dianji_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);

GPIO_SetBits(GPIOE,GPIO_Pin_0);
}
如下是main.c函数

u8 shunxu1[4]={0x08,0x04,0x02,0x01};  //Õýת  D-C-B-A
int x=0x01;
void run()
{
u8 i;
for(i=0;i<4;i++)
{
  GPIO_Write(GPIOE,0x01);
  delay_ms(5);  
}
}

主函数:
int main()
{
Dianji_Init();
delay_ms(30);
while(1)
{
   
}
}


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

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2018-3-18
在线时间
29 小时
 楼主| 发表于 2018-8-26 17:11:52 | 显示全部楼层
编辑一下主函数:
int main()
{
        Dianji_Init();
        delay_ms(30);
        while(1)
        {
                run();
        }
}
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-26 17:27:04 | 显示全部楼层
本帖最后由 warship 于 2018-8-26 17:35 编辑

u8 shunxu1[4]={0x08,0x04,0x02,0x01};  //&#213;y×a  D-C-B-A
int x=0x01;
void run()
{
u8 i;
for(i=0;i<4;i++)
{
  GPIO_Write(GPIOE,shunxu1[ i ] );
  delay_ms(50);  //如果你想用表量电压,这个延时至少要增加到delay_ms(1500)
}
}

主函数:
int main()
{
Dianji_Init();
delay_ms(30);
while(1)
  {
   run();  
  }
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2018-3-18
在线时间
29 小时
 楼主| 发表于 2018-8-26 18:29:56 | 显示全部楼层
本帖最后由 wql1095046181 于 2018-8-26 18:33 编辑
warship 发表于 2018-8-26 17:27
u8 shunxu1[4]={0x08,0x04,0x02,0x01};  //&Otilde;y×a  D-C-B-A
int x=0x01;
void run()

不行哦 我试了加到2500都不可以。   我在那个Dian_Init()里面写  SetBits()是可以实现 高电平3.3v的。但是只要写到这个main.c里面就没办法了
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-26 18:48:10 | 显示全部楼层
wql1095046181 发表于 2018-8-26 18:29
不行哦 我试了加到2500都不可以。   我在那个Dian_Init()里面写  SetBits()是可以实现 高电平3.3v的。但 ...

如果是原子的延时,2500是不支持的。
你可以写成这样:
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
重复5遍就可以得到5秒的延时,
另外,因为run是PE0到PE3来回循环的,
你可以先手工改GPIO_Write(GPIOE,0x01);试试,
然后再手工改GPIO_Write(GPIOE,0x02);等等分别试试。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2018-3-18
在线时间
29 小时
 楼主| 发表于 2018-8-26 21:01:36 | 显示全部楼层
warship 发表于 2018-8-26 18:48
如果是原子的延时,2500是不支持的。
你可以写成这样:
delay_ms(1000);

试完了,只要不写在WHILE(1)循环里面就可以正常拉高拉低电平。但是,按理说我这个电平来回变换,我的模块小灯也应该来回闪,可是他并不闪,我就尝试在每次电平转换加延时函数。加了以后貌似只执行第一次的电平转换(拉高或者拉低),以后就一直不变了。所以这个电机还是驱动不起来
回复

使用道具 举报

9

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-4-6
在线时间
31 小时
发表于 2018-8-26 21:44:23 | 显示全部楼层
我也调试过步进电机,延时的时间,选择何种节拍,io的速度都有关系,这个得一点一点得试
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-26 21:59:05 | 显示全部楼层
wql1095046181 发表于 2018-8-26 21:01
试完了,只要不写在WHILE(1)循环里面就可以正常拉高拉低电平。但是,按理说我这个电平来回变换,我的模块 ...

问题要区分排除,
你这个有点眉毛胡子一把抓了。
是模块的问题?还是程序的问题?先要搞清楚,再去解决对应的问题。
这里是先解决程序问题,先不要把模块扯进来。
电平拉高拉低与是不是写在while里没有关系,只有你能不能反应过来或测量过来的问题。
为了搞清楚这个问题,你可以把模块放在一边,把四个端口各接一个LED,先把程序搞明白再说。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2018-3-18
在线时间
29 小时
 楼主| 发表于 2018-8-27 08:24:17 | 显示全部楼层
warship 发表于 2018-8-26 21:59
问题要区分排除,
你这个有点眉毛胡子一把抓了。
是模块的问题?还是程序的问题?先要搞清楚,再去解决 ...

模块没有问题,应该是出在程序上。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-27 08:36:06 | 显示全部楼层
调试...
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-27 08:54:26 | 显示全部楼层
尝试将主函数改成这样试试:

[mw_shl_code=c,true]主函数:
int main()
{
Dianji_Init();
delay_ms(30);
while(1)
{
   GPIO_Write(GPIOE,0x01);
}
}[/mw_shl_code]

以及这样:

[mw_shl_code=c,true]主函数:
int main()
{
Dianji_Init();
delay_ms(30);
GPIO_Write(GPIOE,0x01);
while(1)
{

}
}[/mw_shl_code]

一个在循环里面,一个在进入循环之前,看看运行效果是否不一样?

除此之外没太看明白楼主的run函数是想要做什么,为什么要加for循环呢??
十六进制带我飞。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-27 20:25:05 | 显示全部楼层
本帖最后由 warship 于 2018-8-27 20:26 编辑
wql1095046181 发表于 2018-8-27 08:24
模块没有问题,应该是出在程序上。

我真的是无语了,
程序就这么几句,
有什么问题,
我可以明确地告诉你,
根本不可能存在你说的电平置高置低写在while里面和外面结果不一样的问题。
只有你能不能反应过来或测量过来的问题!!!怀疑程序问题的话,先按我说的接LED灯观察一下。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-8-28 09:39:07 | 显示全部楼层
你可以先试试
int main()
{
Dianji_Init();
delay_ms(30);
while(1)
  {
  GPIO_SetBits(GPIOE,GPIO_Pin_0);
  }
}

这样先把引脚的电平拉高,把你需要的引脚都拉高,还有在初始化的那句注释了,然后在把你需要用到的引脚全部拉低,看看能不能正常的对引脚进行操作。
回复

使用道具 举报

4

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
588
金钱
588
注册时间
2018-8-17
在线时间
81 小时
发表于 2018-8-29 10:28:36 | 显示全部楼层
先检查硬件问题,会不会是引脚和相邻的串了,或者MCU电流输出不足,被拉低了电压,根据上面说的会不会是时间太短,万用表检测不了,换逻辑分析仪看下。程序如此简单出错的可能很小
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 11:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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