stm32F103c8t6的程序(可方便改成使用的單片機),通過定時器模擬輸出多路脈沖寬度不同的PWM,且脈沖寬度與脈沖寬度改變速度可控。自己用于多路舵機驅動,理論上單片機有多少I/O口就能輸出多少路PWM。!
stm32單片機源程序如下:
- #include "stm32f10x.h"
- #include "TIM.h"
- #include "DELAY.h"
- #include "GPIO.h"
- #include "math.h"
- #include "DATA.h"
- int main()
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//選擇中斷分組4
- GPIO_Configuration();
-
- TIM3_Init(71,9);//每10us進一次中斷
- NVIC3_Configurature();
- TIM2_Init(35999,19);//100Hz
- NVIC2_Configurature();
-
- slaver_SetAngle(0,220,60);//零號舵機,A1
- slaver_SetAngle(1,20,60);//A2
- slaver_SetAngle(2,40,60);//A3
- slaver_SetAngle(3,60,60);
- slaver_SetAngle(4,80,60);
- slaver_SetAngle(5,100,60);
- slaver_SetAngle(6,120,60);
- slaver_SetAngle(8,140,60);
- slaver_SetAngle(9,160,60);
- slaver_SetAngle(10,170,60);
- slaver_SetAngle(11,100,60);
- slaver_SetAngle(12,40,60);
- slaver_SetAngle(13,60,60);
- slaver_SetAngle(14,70,60);
- slaver_SetAngle(15,80,60);
- slaver_SetAngle(16,90,60);
- slaver_SetAngle(17,100,60);
- while(1)
- {
- }
- }
-
- volatile unsigned short pulse_width = 2000;
- volatile unsigned int tim3_cnt = 0;//設置的奇數(shù)位
-
- void TIM3_IRQHandler(void)//TIM3做PWM輸出
- {
- unsigned char j;
- TIM3->SR = 0;//清楚中斷
-
- tim3_cnt++;
- if(tim3_cnt == pulse_width)
- {
- tim3_cnt = 0;
- GPIOA->ODR |= 0XFFFF;//對其他的端口不會影響
- GPIOB->ODR |= 0XFFFF;
- }
- for(j = 0;j < slave_Number;j ++)
- {
- if(tim3_cnt == slaver_data[j].Data_Converted)//等于角度轉換值得到的數(shù)值
- {
- (slaver_data[j].GPIOx)->ODR&=~slaver_data[j].GPIO_Pin;//選擇端口,進行賦值
- }
- }
- }
- void TIM2_IRQHandler(void)//定時器2做控速
- {
- unsigned char i;
- TIM2->SR = 0;
-
- for(i=0; i<slave_Number; i++)
- {
- if(fabs(slaver_data[i].Data_Desire - slaver_data[i].Data_Real) < slaver_data[i].Data_Speed*CYCLE_TIM2_UPDATE)//判斷實際角度與輸入角度的差值
- {
- slaver_data[i].Data_Real = slaver_data[i].Data_Desire;//差值小就直接賦值
- }
- else
- {
- if(slaver_data[i].Data_Desire > slaver_data[i].Data_Real)//輸入值大于實際值
- {
- slaver_data[i].Data_Real += slaver_data[i].Data_Speed*CYCLE_TIM2_UPDATE;//加等于輸入值
- }
- else
- {
- slaver_data[i].Data_Real -= slaver_data[i].Data_Speed*CYCLE_TIM2_UPDATE;//減等于輸入值
- }
- }
- slaver_data[i].Data_Converted = (unsigned short)(50.0f + slaver_data[i].Data_Real*SLAVER_CHANGE);//加上偏移量,轉換數(shù)值
- }
- }
-
復制代碼
所有資料51hei提供下載:
duoji-qudong-5.zip
(318.85 KB, 下載次數(shù): 33)
2018-5-25 10:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|