float speed; int main(void) { Breath_Init (); KEY_InitU(); OLED_Init(); Motor_init(); OLED_ShowString(1,1,"Rspeed:"); while (1) { Motor_derection(20); } } #include "stm32f10x.h" // Device header void Breath_Init () { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); GPIO_InitTypeDef GPIO_Initstucture; GPIO_Initstucture.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽 GPIO_Initstucture.GPIO_Pin=GPIO_Pin_0; GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstucture); TIM_InternalClockConfig(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstucture; TIM_TimeBaseInitstucture.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitstucture.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitstucture.TIM_Period=100-1;//72M/TIM_Period为频率也是ARR TIM_TimeBaseInitstucture.TIM_Prescaler=72-1;//分频也是PSC TIM_TimeBaseInitstucture.TIM_RepetitionCounter=0;//周期数 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstucture); TIM_OCInitTypeDef TIM_OCInitstructure; TIM_OCStructInit(&TIM_OCInitstructure); TIM_OCInitstructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitstructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitstructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitstructure.TIM_Pulse=0;//CCR TIM_OC1Init(TIM2,&TIM_OCInitstructure); TIM_Cmd(TIM2,ENABLE); } void TIM_Compare(uint16_t compare) { TIM_SetCompare1(TIM2,compare); } void KEY_InitD (void)//下拉 { //GPIOB初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode =GPIO_Mode_IPD ; GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); } void KEY_InitU (void)//上拉 { //GPIOB初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode =GPIO_Mode_IPU ; GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); } uint16_t Key_GetNum () { uint8_t KeyNum = 0; if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) { Delay_ms(20); while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); Delay_ms(20); KeyNum = 1; } } void Motor_init () { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; GPIO_Init(GPIOA, &GPIO_InitStructure); } void Motor_derection (float speed) { if(speed>0) { GPIO_SetBits(GPIOA,GPIO_Pin_4);//in1 GPIO_ResetBits(GPIOA,GPIO_Pin_5);//in2 TIM_Compare(speed); } else GPIO_ResetBits(GPIOA,GPIO_Pin_4);//in1 GPIO_SetBits(GPIOA,GPIO_Pin_5);//in2 TIM_Compare(-speed); } 为什么直流电机不转
时间: 2023-09-04 17:10:21 浏览: 73
根据给出的代码,直流电机不转的可能原因有以下几点:
1. 未正确初始化引脚:在`Motor_init()`函数中,需要将GPIOA的引脚4和5初始化为输入上拉模式。但是,在给出的代码中,并没有调用`Motor_init()`函数进行引脚的初始化。因此,需要在`main()`函数中添加`Motor_init()`函数的调用。
2. 未设置合适的方向和速度:在`Motor_derection()`函数中,根据`speed`的正负来设置电机的方向以及使用`TIM_Compare()`函数设置PWM的占空比。需要确保`speed`的值是正确设置且适合驱动电机的范围。
3. 未启动定时器:在`Breath_Init()`函数中,需要使用`TIM_Cmd(TIM2,ENABLE);`启动定时器2。但是,在给出的代码中,并没有调用该函数来启动定时器。因此,需要在`main()`函数中添加该函数的调用。
如果以上问题都已解决,并且硬件连接正确,但直流电机仍然不转动,则可能是其他硬件或电路问题。需要仔细检查硬件连接、电源供应等方面的问题。
相关问题
void timer_isr(void) __interrupt(1) { unsigned char TMR0IF = 0; //清除定时器中断标志位 unsigned char timerCount++; if(timerCount >= BREATH_TIME) { timerFlag = 1; } }怎么修改
可以将 unsigned char timerCount++; 修改为 timerCount++;,因为在函数中已经定义了 timerCount 的类型为 unsigned char,无需再次声明。另外,可以将 if(timerCount >= BREATH_TIME) 修改为 if(timerCount >= BREATH_TIME),使其符合命名规范。修改后的代码如下:
```
void timer_isr(void) __interrupt(1) {
TMR0IF = 0; //清除定时器中断标志位
timerCount++;
if(timerCount >= BREATH_TIME) {
timerFlag = 1;
}
}
```
#define LED 9 #define BUTTON 2 #define POT A0 int brightness = 0; int breath_delay = 1000; int breath_direction = 1; bool auto_mode = true; void setup() { pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT_PULLUP); Serial.begin(9600); } void loop() { if (digitalRead(BUTTON) == LOW) { auto_mode = !auto_mode; delay(50); } if (auto_mode) { analogWrite(LED, brightness); brightness += breath_direction; if (brightness <= 0 || brightness >= 255) { breath_direction = -breath_direction; delay(100); } breath_delay = map(analogRead(POT), 0, 1023, 3000, 0); delay(breath_delay / 255); } else { brightness = map(analogRead(POT), 0, 1023, 0, 255); analogWrite(LED, brightness); delay(10); } }对以上代码进行注释并说明信号类型
以下是对代码的注释和信号类型的说明:
```c++
#define LED 9 // 定义 LED 引脚为 9
#define BUTTON 2 // 定义按钮引脚为 2
#define POT A0 // 定义电位器引脚为 A0
int brightness = 0; // 初始化亮度为 0
int breath_delay = 1000; // 初始化呼吸灯延迟时间为 1000 毫秒
int breath_direction = 1; // 初始化呼吸灯方向为增加
bool auto_mode = true; // 初始化自动模式为开启
void setup() {
pinMode(LED, OUTPUT); // LED 引脚设为输出模式
pinMode(BUTTON, INPUT_PULLUP); // 按钮引脚设为输入模式并开启内部上拉电阻
Serial.begin(9600); // 开启串口通信
}
void loop() {
if (digitalRead(BUTTON) == LOW) { // 若检测到按钮被按下
auto_mode = !auto_mode; // 切换自动模式状态
delay(50); // 延迟一段时间以避免抖动
}
if (auto_mode) { // 若处于自动模式下
analogWrite(LED, brightness); // 设定 LED 亮度
brightness += breath_direction; // 增加或减小亮度
if (brightness <= 0 || brightness >= 255) { // 若亮度达到最大或最小值
breath_direction = -breath_direction; // 反转亮度变化方向
delay(100); // 停顿一段时间以使效果更明显
}
breath_delay = map(analogRead(POT), 0, 1023, 3000, 0); // 读取电位器数值并将其映射到呼吸灯延迟时间
delay(breath_delay / 255); // 根据当前亮度和呼吸灯延迟时间设定延迟时长
}
else { // 若处于手动模式下
brightness = map(analogRead(POT), 0, 1023, 0, 255); // 读取电位器数值并将其映射到 LED 亮度
analogWrite(LED, brightness); // 设定 LED 亮度
delay(10); // 稍微延迟一下以避免频繁改变亮度
}
}
```
信号类型:
1. LED 控制信号:PWM 信号
2. 按钮输入信号:数字信号(HIGH 或 LOW)
3. 电位器输入信号:模拟信号(0 到 1023 的数值)
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)