I think all of us who have done the small free-lance thing have had to deal with this. Most of what I was going to write has already been covered in Stefan's answer, but I have a few more thoughts...
Never ever feel awful about asking for money up front. They are going to have to pay for your service, whether up front or after the fact - so why feel bad about the timing? In general, people pay up-front for everything (or sign a contract to pay later). Your services are not any less valuable than those of other vendors.
The key to this is having a clear definition and agreement. If you have a written agreement, and get part of the money up-front or in stages, it empowers you to dig in your heels and say "this is what you agreed to, and this is what you have paid for". If a client starts to make too many requests, you will have to draw the line.
For what it's worth, below is the workflow guideline that I adhere to. I do most of my work in a small 2-man team and this has worked well for us. Everything is broken down by stage, with requirements to be fulfilled before progressing to the next stage.
We collaborate with the client to define an detailed spec of the project requirements before we do any work. This involves all of their requirements (layout, colors, branding, time, etc.) all of our requirements (time, money, etc.)
We don't proceed out of this stage until we understand the client, and the client understands us. We typically require a non-refundable payment (generally not 100%, but a significant portion of the project quote) at this point.
Wireframes & sketches are used to knock down a basic layout. Some rough styling will be done, but none of the time-consuming minor tweaks that really polish a design. We don't continue to the next stage until the client agrees that they are happy with the overall design.
If the client wants something that is not part of the agreed project definition, we stop everything and revise the definition & price accordingly.
For logos & simple print designs, this is the last phase and just involves polishing the design.
At this point, if the client says "I want to change X about the layout" and it's a nontrivial change, we simple say "sorry, that needed to be done during the Design phase". If they are adamant that they need to make the change, we quote them a price to alter the agreement.
The client gets their product. We get any remaining payment. The books are closed and we are done. After this point, any change is treated as a new job and is quoted accordingly.
(If we're doing a website or app, there is also an Assembly and Debugging stage before Delivery.)
Generally we require payment at each major stage. Ie., before Design, before Assembly, before Delivery. This keeps us on equal footing with our clients -- at any point of the game, we have provided part of a product and received part of a payment. If they fire us, we walk away with a clean soul and without having done work for free. This hasn't happened yet, but I don't doubt that it will someday. People are fickle.
I think this equal footing is extremely important. We don't ask too much of them without providing anything in return, and do not give them too much without requiring something in return.
If you devalue your work, a client will not hesitate to increase requirements (by way of revisions, changes, suggestions, etc.) - and if you do not have an agreement in place (and some money in your pocket), you may feel beholden to their requests.