|
做的一個(gè)舵機(jī),很棒,用處很大
單片機(jī)源程序如下:
- /*
- 單片機(jī):STM32F103RCT6/STM32F103C8T6 倍頻 72M 8路舵機(jī)控制
- 舵機(jī)IO PA0~PA3 PB3~PB6
- */
- #include "stm32f10x_conf.h"
- #define tb_interrupt_open() {__enable_irq();} //總中斷打開
- void rcc_init(void); //主頻設(shè)置
- void delay_ms(unsigned int t); //毫秒級(jí)別延時(shí)
- void dj_io_init(void); //舵機(jī) IO 口初始化
- void dj_io_set(u8 index, u8 level); //舵機(jī) IO 口高低電平設(shè)置
- void TIM2_Int_Init(u16 arr,u16 psc);//舵機(jī) 定時(shí)器初始化
- void gpioA_pin_set(unsigned char pin, unsigned char level);
- void gpioB_pin_set(unsigned char pin, unsigned char level);
- //舵機(jī)脈沖數(shù)組
- int duoji_pulse[8] = {1500,1500,1500,1500,1500,1500,1500,1500} , i;
- int main(void) {
- rcc_init();
- dj_io_init();
- TIM2_Int_Init(20000,71);
- tb_interrupt_open();
- while(1) {
- for(i=0;i<8;i++) {
- duoji_pulse[i] = 1000;//循環(huán)把8個(gè)舵機(jī)位置設(shè)定到1000
- }
- delay_ms(1000);
- for(i=0;i<8;i++) {
- duoji_pulse[i] = 2000;//循環(huán)把8個(gè)舵機(jī)位置設(shè)定到2000
- }
- delay_ms(1000);
- }
- }
- void rcc_init(void) {
- ErrorStatus HSEStartUpStatus;
- RCC_DeInit();
- RCC_HSEConfig(RCC_HSE_ON);
- HSEStartUpStatus = RCC_WaitForHSEStartUp();
- while(HSEStartUpStatus == ERROR);
- RCC_HCLKConfig(RCC_SYSCLK_Div1);//SYSCLK
- RCC_PCLK1Config(RCC_HCLK_Div2);//APB1 MAX = 36M
- RCC_PCLK2Config(RCC_HCLK_Div1);//APB2 MAX = 72M
- RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
- RCC_PLLCmd(ENABLE);
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- while(RCC_GetSYSCLKSource() != 0x08);
- }
- void delay_ms(unsigned int t) {
- int t1;
- while(t--) {
- t1 = 7200;
- while(t1--);
- }
- }
- void dj_io_init(void) {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 | GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- void dj_io_set(u8 index, u8 level) {
- switch(index) {
- case 0:gpioA_pin_set(0, level);break;
- case 1:gpioA_pin_set(1, level);break;
- case 2:gpioA_pin_set(2, level);break;
- case 3:gpioA_pin_set(3, level);break;
- case 4:gpioB_pin_set(3, level);break;
- case 5:gpioB_pin_set(4, level);break;
- case 6:gpioB_pin_set(5, level);break;
- case 7:gpioB_pin_set(6, level);break;
- default:break;
- }
- }
- void gpioA_pin_set(unsigned char pin, unsigned char level) {
- if(level) {
- GPIO_SetBits(GPIOA,1 << pin);
- } else {
- GPIO_ResetBits(GPIOA,1 << pin);
- }
- }
- void gpioB_pin_set(unsigned char pin, unsigned char level) {
- if(level) {
- GPIO_SetBits(GPIOB,1 << pin);
- } else {
- GPIO_ResetBits(GPIOB,1 << pin);
- }
- }
- void TIM2_Int_Init(u16 arr,u16 psc) {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //①時(shí)鐘 TIM2 使能
- //定時(shí)器 TIM2 初始化
- TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置自動(dòng)重裝載寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置時(shí)鐘頻率除數(shù)的預(yù)分頻值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上計(jì)數(shù)
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //②初始化 TIM2
- TIM_ARRPreloadConfig(TIM2, DISABLE);
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //③允許更新中斷
-
- //中斷優(yōu)先級(jí) NVIC 設(shè)置
- NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2 中斷
- //NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0000);
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占優(yōu)先級(jí) 0 級(jí)
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //從優(yōu)先級(jí) 2 級(jí)
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
- NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
- TIM_Cmd(TIM2, ENABLE); //⑤使能 TIM2
- }
- void TIM2_IRQHandler(void) {
- static u8 flag = 0;
- static u8 duoji_index1 = 0;
- int temp;
- if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查 TIM2 更新中斷發(fā)生與否
- {
- TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除 TIM2 更新中斷標(biāo)志
-
- if(duoji_index1 == 8) {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
32單個(gè)舵機(jī)控制源碼.rar
(1.22 MB, 下載次數(shù): 36)
2018-6-30 18:17 上傳
點(diǎn)擊文件名下載附件
32的舵機(jī)
|
評(píng)分
-
查看全部評(píng)分
|