1.对电机进行驱动——
就是pwm,一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//使能TIM1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
//写初值(预分频寄存器PSC,自动重装载寄存器ARR,计数模数CR1 .BIT4)
TIM_InitStructure.TIM_Prescaler = 719;
TIM_InitStructure.TIM_Period = 99;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.TIM_RepetitionCounter = 0; //高级定时器特有RCR寄存器
TIM_TimeBaseInit(TIM1,&TIM_InitStructure);
//使能中断允许位 DIER .BIT0
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
//中断通道使能
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;//使能tim1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//设置响应优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//开启计数器 CR1 .BIT0
TIM_Cmd(TIM1,ENABLE);

Car_State = STOP;
Car_PWM = 0;
OLED_Print(8,0, (uint8_t *)"STA:STOP ",TYPE8X16,TYPE6X8); //打印电机状态
OLED_Print(72, 0, (uint8_t *)"SPEED:00",TYPE8X16,TYPE6X8); //打印电机速度
}

分频的计算方式

TIM_TimeBaseStructure.TIM_Prescaler = 71; // PSC
计数频率=芯片频率/(预分频值PSC+1)
解释:预分频值的数字表示n个竖杠,将整体分成n+1个计数区域

TIM_TimeBaseStructure.TIM_Period = 999; // ARR
PWM波的信号周期=(自动重装载寄存器的值(ARR)+1)/记数频率

TIM_InitStructure.TIM_ClockDivision = 0; //时钟分频因子
TIM_CKD_DIV1:对应的值为 0x00,意味着时钟分频因子为 1,也就是不对定时器的输入时钟进行额外的分频。
TIM_CKD_DIV2:对应的值为 0x01,时钟分频因子为 2,即把输入时钟频率除以 2。
TIM_CKD_DIV4:对应的值为 0x02,时钟分频因子为 4,也就是将输入时钟频率除以 4。

2.舵机轮子左右

3.蓝牙模块
判别收到的数据

*** 这是我现阶段负责的红外模块的代码笔记
传到oled显示需要设变量传递

然后按位运算,移位加减,刚好可以利用上for,是技巧了

ir