本实验是用PWM驱动寻迹小车,代码已经测试过了,写了好久,现在分享给大家。
单片机源程序如下:
- #include "stm32f10x.h" //官方库
- #include "delay.h"
- #include "sys.h"
- #include "motor.h"
- #include "led.h"
- #include "stdio.h"
- #include "hw.h"
- #include "key.h"
- #include "timer.h"
- int main(void)
- {
- u8 key;
- delay_init(72);
- LED_config();
- KEY_Init();
- hw_init();
- Motor_Init();
- // TIM4_Int_Init(4999,7199);
- PWM_Init(899,0);
-
-
- while(1)
- {
- key=KEY_Scan(0); //得到键值
- if(key==KEY1_PRES){
- LED0=0;
- xunji();
- }
-
- // carStraight(400,400);
- }
-
- }
复制代码
- #include "motor.h"
- #include "hw.h"
- #include "delay.h"
- #include "timer.h"
- void Motor_Init(void)
- {
- RCC->APB2ENR|=1<<2; //PORTA时钟使能
- GPIOA->CRH&=0XFFF00FFF; //PORTA11 12 4 5推挽输出
- GPIOA->CRH|=0X00033000; //PORTA11 12 4 5推挽输出
- GPIOA->ODR |= 1<<11;
- GPIOA->ODR |= 1<<12;
- GPIOA->CRL&=0XFF00FFFF; //PORTA11 12 4 5推挽输出
- GPIOA->CRL|=0X00330000; //PORTA11 12 4 5推挽输出
- GPIOA->ODR |= 1<<4;
- GPIOA->ODR |= 1<<5;
- }
- void carStraight(u16 leftPWM, u16 rightPWM)
- {
- setPWM(leftPWM,rightPWM);
- LEFT_1 = 1;
- LEFT_2 = 0;
- RIGHT_1 = 1;
- RIGHT_2 = 0;
- }
- void carLeft(u16 leftPWM, u16 rightPWM){
- setPWM(leftPWM,rightPWM);
- LEFT_1 = 0;
- LEFT_2 = 1;
-
- RIGHT_1 = 1;
- RIGHT_2 = 0;
- }
- void carRight(u16 leftPWM, u16 rightPWM){
- setPWM(leftPWM,rightPWM);
- LEFT_1 = 1;
- LEFT_2 = 0;
-
- RIGHT_1 = 0;
- RIGHT_2 = 1;
- }
- void carBack(u16 leftPWM, u16 rightPWM){
- setPWM(leftPWM,rightPWM);
-
- LEFT_1 = 0;
- LEFT_2 = 1;
- RIGHT_1 = 0;
- RIGHT_2 = 1;
- }
- void carStop(){
- LEFT_1 = 1;
- LEFT_2 = 1;
- RIGHT_1 = 1;
- RIGHT_2 = 1;
- }
- void zuoxuan (u16 leftPWM, u16 rightPWM)
- {setPWM(leftPWM,rightPWM);
-
- LEFT_1 = 1;
- LEFT_2 = 0;
- RIGHT_1 = 1;
- RIGHT_2 = 1;
-
- delay_ms(80);
- carStop();
- }
- void xunji()
- {
- while(1){
-
- if(LEFT_FIND == 0)
- {
- carStraight(0,0);
- }
- else
- {
- zuoxuan(0,899); }
-
- }
-
- }
- //||(RIGHT_FIND == 1 &&MIDDLE_FIND==1 &&LEFT_FIND == 1)
复制代码
所有资料51hei提供下载:
小车 - PWM -2.7z
(177.86 KB, 下载次数: 34)
|