初级会员

- 积分
- 197
- 金钱
- 197
- 注册时间
- 2013-11-24
- 在线时间
- 8 小时
|

楼主 |
发表于 2014-4-12 16:37:15
|
显示全部楼层
#define M0_Y0 {PBout(8)=0;  Bout(9)=0;  Bout(10)=0;}
#define M0_Y1 {PBout(8)=1;  Bout(9)=0;  Bout(10)=0;}
#define M0_Y2 {PBout(8)=0;  Bout(9)=1;  Bout(10)=0;}
#define M0_Y3 {PBout(8)=1;  Bout(9)=1;  Bout(10)=0;}
#define M0_Y4 {PBout(8)=0;  Bout(9)=0;  Bout(10)=1;}
#define M0_Y5 {PBout(8)=1; PBout(9)=0; PBout(10)=1;}
#define M0_Y6 {PBout(8)=0; PBout(9)=1; PBout(10)=1;}
#define M0_Y7 {PBout(8)=1; PBout(9)=1; PBout(10)=1;}
u8 num[3];
u8 width[3];
u8 M0[7]={15,15,15,15,15,15,15};
u8 M1[7]={15,15,15,15,15,15,15};
u8 M2[7]={15,15,15,15,15,15,15};
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
width[0]=num[0]%25;
num[0]++;
switch(num[0]/25)
{
case 0:
if(width[0]<M0[0])
M0_Y0
else
M0_Y7
break;
case 1:
if(width[0]><M0[1])
M0_Y1
else
M0_Y7
break;
case 2:
if(width[0]><M0[2])
M0_Y2
else
M0_Y7
break;
case 3:
if(width[0]><M0[3])
M0_Y3
else
M0_Y7
break;
case 4:
if(width[0]><M0[4])
M0_Y4
else
M0_Y7
break;
case 5:
if(width[0]><M0[5])
M0_Y5
else
M0_Y7
break;
case 6:
if(width[0]><M0[6])
M0_Y6
else
M0_Y7
break;
default:
M0_Y7
if(num[0]>=200)
num[0]=0;
break;
}
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timer3_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
// TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
Timer3_Init(9,719);//100Khz的计数频率,计数到10为100us
定时器是100us进一次中断
虽然这个电路能产生8路PWM 但是楼主只要7路就够用 所以,上面的程序我把接通第八路当做其他路的低电平用了,没用74HC238D的E1,E2,E3来控制低电平。 |
|